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

2023-09-24  本文已影响0人  生信云笔记

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

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

1、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

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

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 | 开发自己的画图函数

上一篇下一篇

猜你喜欢

热点阅读