【问题标题】:Function to apply arbitrary functions in R在 R 中应用任意函数的函数
【发布时间】:2011-05-31 18:53:34
【问题描述】:

如何在 R 中实现函数 apply.func(func, arg.list),该函数将任意函数 func 和合适的列表 arg.list 作为参数,并返回使用包含在 arg.list 中的参数调用 func 的结果.例如

apply.func(foo, list(x="A", y=1, z=TRUE))

等价于

foo(x="A", y=1, z=TRUE)

谢谢!

附: FWIW,apply.func 的 Python 等价物类似于

def apply_func(func, arg_list):
    return func(*arg_list)

def apply_func(func, kwarg_dict):
    return func(**kwarg_dict)

或其一些变体。

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为do.call 是您正在寻找的。你可以通过?do.call阅读。

    人们如何使用do.call 的经典示例是将rbind 数据框或矩阵一起使用:

    d1 <- data.frame(x = 1:5,y = letters[1:5])
    d2 <- data.frame(x = 6:10,y = letters[6:10])
    
    do.call(rbind,list(d1,d2))
    

    这是另一个使用sum 的相当简单的示例:

    do.call(sum,list(1:5,runif(10)))
    

    【讨论】:

      【解决方案2】:

      R 允许将函数作为参数传递给函数。这意味着您可以如下定义apply.func(其中f 是一个函数,... 表示所有其他参数:

      apply.func <- function(f, ...)f(...)
      

      然后您可以使用apply.func 并指定参数有意义的任何函数:

      apply.func(paste, 1, 2, 3)
      [1] "1 2 3"
      
      apply.func(sum, 1, 2, 3)
      [1] 6
      

      但是,请注意以下可能不会产生您预期的结果,因为mean 将向量作为参数:

      apply.func(mean, 1, 2, 3)
      [1] 1
      

      请注意,还有一个名为 do.call 的基本 R 函数可以有效地做同样的事情。

      【讨论】:

      • f &lt;- match.fun(f) 将进行完整性检查,如果函数参数是存在函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多