看起来很简单,说起来很容易,听起来不复杂:
工作中积累一些属于自己的小函数,提升编程水平的同时,也可以减去重复劳动的枯燥从而提高工作效率,也可谓一举两得的好事!
有时候使用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 | 开发自己的画图函数
网友评论