在下面的示例中,我想将第3个变量添加到列表中,然后将其用作R函数中的函数参数(使用do.call
)。问题是我无法在连接列表中维护名称,因此允许函数调用正确的参数:
# The function (a linear regression)
fun <- function(a=10, b=12, x=1:3){
y <- a + b*x
y
}
# Example of function use
x <- runif(20)
plot(x, fun(x=x))
# New list of function arguments
L <- list(a=3, b=-2, c=4)
x <- runif(20)
# Attempts to call function with arguments
args.incl <- which(names(L) %in% names(formals(fun)))
do.call(fun, args=c(L[args.incl], x=x)) # x is not maintained
do.call(fun, args=list(L[args.incl], x=x)) # a and b names are lost
我意识到一个解决方案是将x
添加到列表L
,但我不想这样做。
答案 0 :(得分:3)
怎么样
do.call(fun, c(L[args.incl], list(x=x)))
这样您就可以将列表c
和L[args.incl]
list(x=x)
集中到列表中。
> c(L[args.incl], list(x=x))
$a
[1] 3
$b
[1] -2
$x
[1] 0.29227694 0.42304815 0.90256006 0.91309103 0.43949887 0.64453528 0.48544861 0.09220676 0.48814042
[10] 0.47410596 0.32798225 0.18795248 0.17939297 0.88327417 0.45593052 0.29455631 0.06932314 0.10265696
[19] 0.61977174 0.74408227
这就是你的p.s.建议在飞行中
答案 1 :(得分:2)
这似乎有效,使用modifyList
:
do.call(fun, args=modifyList(L[args.incl], list(x=x)))
# [1] 2.961918 2.071065 2.113825 1.601956 1.931469 2.334662 1.484844 2.943622
# [9] 1.917024 1.838480 1.060532 2.198088 2.451811 2.181310 1.306844 1.397075
# [17] 1.910102 2.940142 2.313939 2.991235
答案 2 :(得分:2)
使用此
do.call(fun, args=c(L[args.incl],x=list(x)))