【问题标题】:R: specifying a string as an argument of a function that calls another functionR:将字符串指定为调用另一个函数的函数的参数
【发布时间】:2011-06-24 23:55:50
【问题描述】:

这是一个关于 R 中编码的问题。

我提供的例子是说教的。假设我有名为“func1”和“func2”的函数,每个函数都有两个参数(比如说标量)。我想指定另一个具有三个参数的函数“applyfunction”:要使用的函数的最后一个数字(“1”或“2”),以及该函数的两个参数。比如我想做这样的事情(当然不行):

applyfunction(1,2,3) 可以有效运行 func1(2,3)

applyfunction(2,9,43) 可以有效运行 func2(9,43)

有什么想法吗?

最好的,DB

【问题讨论】:

    标签: function r apply do.call


    【解决方案1】:

    您可能想查看do.call(),它使用列表中提供的参数调用函数。围绕它编写一个完全符合您要求的包装器并不难。

    function1=function(a,b)a+b
    function2=function(a,b,c)a+b+c
    
    do.call("function1",list(1,2))
    do.call("function2",list(1,2,3))
    

    编辑:包装器是:

    applyfunction=function(fun,...)do.call(fun,list(...))
    
    applyfunction("function1",1,2)
    applyfunction("function2",1,2,3)
    

    【讨论】:

      【解决方案2】:

      这是另一种选择。您可以在switch 列表中添加更多功能。

      func1 <- function(a, b) a + b
      func2 <- function(a, b) a - b
      applyfunction <- function(FUN, arg1, arg2) {
        appFun <- switch(FUN,
            func1,  # FUN == 1
            func2,  # FUN == 2
            stop("function ", FUN, " not defined"))  # default
        appFun(arg1, arg2)
      }
      applyfunction(1,2,3)
      # [1] 5
      applyfunction(2,9,43)
      # [1] -34
      applyfunction(3,9,43)
      # Error in applyfunction(3, 9, 43) : function 3 not defined
      

      【讨论】:

        【解决方案3】:

        如果您真的希望“按数字”完成:

        > applyfunction=function(n,a,b){get(paste("func",n,sep=""))(a,b)}
        > func1=function(a,b){a+b}
        > func2=function(a,b){a*b}
        > applyfunction(1,4,3)
        [1] 7
        > applyfunction(2,4,3)
        [1] 12
        

        使用 get 和 paste 获取与名称关联的函数。

        【讨论】:

        • match.funget 稍微好一点。
        • @hadley:为什么?在这种情况下,match.fun 不会只用envirmode args 调用get 吗?
        • 展开,是的,你是对的,但答案并没有这样做,而且这个名字更令人回味
        • @hadley:谢谢,只是想确保我理解了。
        【解决方案4】:

        将函数变量之一用作开关怎么样?

        func1 <- function(x,y,z) { 
        ## Function One stuff goes here
        if (x == 1) { 
        var1 <- 1 
        } 
        ## Function Two stuff goes here 
        if (x == 2) { 
        var1 <- 2 
        }
        return(var1)
        } 
        

        而且,你可以使用相同的功能,开关是变量“x”:

        > func1(1,1,1)
        [1] 1
        > func1(2,1,1)
        [1] 2
        

        【讨论】:

          【解决方案5】:

          这里是切换或粘贴的替代方法,只需使用索引从列表中选择:

           function1=function(a,b) a+b
           function2=function(a,b,c) a*b
           applyfunc <- function(n, aa, bb){ c(function1, function2)[[n]](aa,bb) }
           applyfunc(1, 4, 3)
           # [1] 7
           applyfunc(2, 4, 3)
           #[1] 12
           applyfunc(3, 4, 3)
          # Error in c(function1, function2)[[n]] : subscript out of bounds
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-02-03
            • 1970-01-01
            • 2021-05-02
            • 1970-01-01
            • 1970-01-01
            • 2015-05-29
            • 2020-07-20
            相关资源
            最近更新 更多