在R中应用任意函数的函数

kjo*_*kjo 7 r

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

apply.func(foo, list(x="A", y=1, z=TRUE))
Run Code Online (Sandbox Code Playgroud)

相当于

foo(x="A", y=1, z=TRUE)
Run Code Online (Sandbox Code Playgroud)

谢谢!

PS FWIW,Python的等价的apply.func会是这样的

def apply_func(func, arg_list):
    return func(*arg_list)
Run Code Online (Sandbox Code Playgroud)

要么

def apply_func(func, kwarg_dict):
    return func(**kwarg_dict)
Run Code Online (Sandbox Code Playgroud)

或其某些变体.

jor*_*ran 17

我认为do.call这就是你要找的东西.你可以通过阅读?do.call.

人们如何使用的典型例子do.callrbind数据帧或矩阵:

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))
Run Code Online (Sandbox Code Playgroud)

这是另一个相当简单的例子sum:

do.call(sum,list(1:5,runif(10)))
Run Code Online (Sandbox Code Playgroud)


And*_*rie 8

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

apply.func <- function(f, ...)f(...)
Run Code Online (Sandbox Code Playgroud)

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

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

apply.func(sum, 1, 2, 3)
[1] 6
Run Code Online (Sandbox Code Playgroud)

但请注意,以下内容可能无法产生您期望的结果,因为mean将矢量作为参数:

apply.func(mean, 1, 2, 3)
[1] 1
Run Code Online (Sandbox Code Playgroud)

请注意,还有一个基本R函数被调用do.call,它有效地做同样的事情.

  • 如果函数参数存在函数,`f < - match.fun(f)`将进行健全性检查. (2认同)