我的函数有很多参数。所以我想创建一个参数列表并将它们传递给函数。
例如,取?mean
函数:
mean(x, trim = 0, na.rm = FALSE, ...)
所以我想说我想计算1:10的平均值,这里是x,但是将其他参数作为列表传递:
gm <- list (trim = 0, na.rm = FALSE)
mean(1:10, gm)
Error in mean.default(1:10, gm) : 'trim' must be numeric of length one
我尝试使用do.call
,但也无法使用。
do.call(mean,list(1:10, gm))
Error in mean.default(1:10, list(trim = 0, na.rm = FALSE)) :
'trim' must be numeric of length one
答案 0 :(得分:0)
如评论中所述,您的gm
的形状与do.call
不符,它将您的选项列表解释为trim
的自变量。
要使参数正确成形,请使用c
:
gm <- list(trim=0, na.rm=FALSE)
do.call(mean, c(list(1:10), gm))
[1] 5.5
答案 1 :(得分:0)
您可以设置默认参数,如果您反复进行此操作(而不是使用do.call
),则可以方便地设置默认参数。您可以使用formals
进行以下操作:
f <- mean.default
formals(f)[match(names(formals(f)), names(gm))] <- gm
f(1:10)
#R> [1] 5.5
这里有一些需要注意的极端情况。例如,我使用mean.default
而不是mean
,因为否则我必须将gm
中的参数放在...
之前。
do.call
的另一种替代方法是创建一个call
并使用eval
:
cl <- as.call(c(list(quote(mean), x = 1:10), gm))
cl
#R> mean(x = 1:10, trim = 0, na.rm = FALSE)
eval(cl)
#R> [1] 5.5
答案 2 :(得分:0)
这也可以使用rlang::exec
和unquote-splice运算符!!!
来完成。
rlang::exec(mean, 1:10, !!!gm)
#> [1] 5.5