如何在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.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))
Run Code Online (Sandbox Code Playgroud)
这是另一个相当简单的例子sum:
do.call(sum,list(1:5,runif(10)))
Run Code Online (Sandbox Code Playgroud)
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,它有效地做同样的事情.