美文网首页
R编程技巧 | 学习高手实现函数多功能化的两种方法

R编程技巧 | 学习高手实现函数多功能化的两种方法

作者: 生信云笔记 | 来源:发表于2023-09-24 17:18 被阅读0次

  看起来很简单,说起来很容易,听起来不复杂:

  工作中积累一些属于自己的小函数,提升编程水平的同时,也可以减去重复劳动的枯燥从而提高工作效率,也可谓一举两得的好事!
  有时候使用R函数时,会发现有些参数会有多个可选值,不同的选项完成不同的目标。这着实是个不错的选择,一个函数可以用来做多个事情,这种多功能自带的魅力谁能抵挡呢!
  这样多功能的函数是如何实现的呢?咱们下面来看一看。

1、match.arg + switch

  • match.arg:单参数形式中 match.arg(arg),match.arg函数会从调用者的形参选项值中返回匹配最佳的值。
  • switch:主要用于处理数字或者字符串,并根据输入返回某个分支的结果。

  下面用一个简单的例子,来演示如何结合两个函数来完成多选功能:

stat <- function(x,  method = c("mean", "median", "min", "max", "sum", "stdev", "var")) {
   method <- match.arg(method)

   switch(method,
          mean = mean(x),
          median = median(x),
          min = min(x),
          max = max(x),
          sum = sum(x),
          stdev = sd(x),
          var = var(x))
}

vec <- sample(1:100, size=10, replace=F)
vec
[1]  8 24 28 13 84 97 18 55 16 81

stat(vec)
[1] 42.4

stat(vec, method='max')
[1] 97

stat(vec, 'med')
[1] 26

stat(vec, method='center')
Error in match.arg(method) :
  'arg' should be one of “mean”, “median”, “min”, “max”, “sum”, “stdev”, “var”

  上面的示例自定义了一个函数stat,该函数可以根据参数method的值来对向量做求均值、中位值、最小值、最大值、和、标准差、方差等相应的操作,method默认值为mean。
  另外,输入method参数时,可以选择值的部分名称,就像示例中med就代表median,因为在所有选项中只有median开头三个字母是med
  该方法还可以检验选择是否存在,如果提供的选项不存在函数会给出错误提示并退出运行。

2、eval + parse

  • eval:输入参数为表达式对象,然后把该对象当做R代码去执行。
  • parse:接受字符串为参数并将其解析为表达式。

  通过函数的功能描述,便可以想象到这两个函数结合起来必然可以做一些事情。还用上面的示例来演示,看看这种方法的具体过程:

stat2 <- function(x,  method = c("mean", "median", "min", "max", "sum", "stdev", "var")) {
   method <- match.arg(method)
   func <- eval(parse(text = method))
   func(x)
}

stat2(vec)
[1] 42.4

stat2(vec, method='max')
[1] 97

stat2(vec, 'med')
[1] 26

stat2(vec, method='center')
Error in match.arg(method) :
  'arg' should be one of “mean”, “median”, “min”, “max”, “sum”, “stdev”, “var”

  条条大路通罗马,这也达到了跟第一个方法一摸一样的效果,并且实现的过程比前者更为简洁优雅。
  该说不说match.arg函数功能真的很贴心,用它来检验参数是否正确超方便,尤其是参数有多个选项的时候。
  不积跬步,无以至千里。当下正是积累的好时光,相信有一天自己做事也会变得像别人那般,轻松优雅!

  做起来才会知道需要消耗的精力和时间:

往期回顾

个性化ChIPseeker注释peak结果,基因 or 功能区类型随心选,好用的脚本等你来取
linux | while + read 实现本地 or 集群批处理,实用且优雅
pyscenic | 单细胞转录因子分析,原理图文详解
一网打尽scRNA矩阵格式读取和转化(h5 h5ad loom)
ggplot2 | 开发自己的画图函数

相关文章

  • iOS 10可视化编程之约束篇(1)

    在iOS中有两种可以实现的可视化编程的方法,一种是StoryBoard,俗称sb,是iOS下可视化编程的方式之一,...

  • 2019-07-11

    [toc] 1、什么是模块化 1.1 掌握模块化编程的实现方法 1.2 立即执行函数写法 1.3 放大模式 1.4...

  • Java 函数式编程实例

    函数式编程概念 函数式编程是一种编程的范式和编程的方法论(programming paradigm),它属于结构化...

  • python核心编程笔记(11-12)

    十一:函数和函数式编程 11.1 什么是函数? 函数是对程序逻辑进行结构化或过程化的一种编程方法。能将整块代码巧妙...

  • 函数式编程

    目录 [TOC] 课程介绍 为什么要学习函数编程以及什么是函数编程 函数式编程的特性(纯函数、柯里化、函数组合等)...

  • redis高级应用

    认证实现方法 两种方法实现: 修改'redis.conf'文件requirepass [password] 使用r...

  • 杂React-Native

    类的创建方式有两种 目前发现的区别是在 写方法的命名 初始化函数 var YTK_R_Project = Reac...

  • 函数式编程

    1 文章目标 为什么要学习函数式编程以及什么是函数式编程 函数式编程的特性(纯函数、柯里化、函数组合等) 函数式编...

  • Day17 统计函数

    Subtotal函数 今天学习统计函数subtotal,它不是一个函数,而是一群函数,一个函数就可以实现很多功能 ...

  • R四大高效编程神器——apply家族

    本节提要:apply()函数sapply()函数lapply()函数tapply()函数 熟悉R编程的人都知道R语...

网友评论

      本文标题:R编程技巧 | 学习高手实现函数多功能化的两种方法

      本文链接:https://www.haomeiwen.com/subject/quvnmdtx.html