如何在r函数中将参数作为列表传递

时间:2014-10-09 03:17:01

标签: r function arguments

我的函数有很多参数。所以我想创建一个参数列表并将它们传递给函数。

例如,取?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

3 个答案:

答案 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