如何在R中实现函数apply.func(func, arg.list)
,它将任意函数func
和合适的列表arg.list
作为参数,并返回调用func
的结果使用arg.list
中包含的参数。 E.g。
apply.func(foo, list(x="A", y=1, z=TRUE))
相当于
foo(x="A", y=1, z=TRUE)
谢谢!
P.S。 FWIW,Python的等价物apply.func
就像是
def apply_func(func, arg_list):
return func(*arg_list)
或
def apply_func(func, kwarg_dict):
return func(**kwarg_dict)
或其中的一些变体。
答案 0 :(得分: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))
这是使用sum
的另一个相当简单的例子:
do.call(sum,list(1:5,runif(10)))
答案 1 :(得分:8)
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函数可以有效地执行相同的操作。