美文网首页
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 | 开发自己的画图函数

    相关文章

      网友评论

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

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