如何在将列表与新变量连接时保持列表名称

时间:2015-02-16 09:23:34

标签: r

在下面的示例中,我想将第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

P.S。

我意识到一个解决方案是将x添加到列表L,但我不想这样做。

3 个答案:

答案 0 :(得分:3)

怎么样

do.call(fun, c(L[args.incl], list(x=x)))

这样您就可以将列表cL[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)))