我对R有一个相对简单的问题,我希望我们能找到解决方案。
我的目标是定义以下列表,其中c元素应该是先前定义的a
和b
元素的总和:
ex.list = list(
a = 1,
b = 2,
c = a+b
)
代码抛出错误(Error: object 'a' not found
),表示我们不能使用上面定义的a和b元素。
当然,我们可以简单地计算清单定义中的总和
ex.list = list(
a = 1,
b = 2
)
ex.list$c = ex.list$a + ex.list$b
或者在创建列表时使用其他元素
a.ex = 1
b.ex = 2
ex.list = list(
a = a.ex,
b = b.ex,
c = a.ex+b.ex
)
不幸的是,我对上述解决方案不感兴趣。有没有办法在列表定义中进行总结?
答案 0 :(得分:3)
不,你不能这样做。但你可以做这样的疯狂事情:
> (function(a,b,c=a+b){list(a=a,b=b,c=c)})(11,22)
$a
[1] 11
$b
[1] 22
$c
[1] 33
但实际上,如果您希望以特定方式构建列表,请编写一个函数来执行此操作。这并不难。
答案 1 :(得分:2)
您可以编写自己的list
函数进行延迟评估:
lazyList <- function(...) {
tmp <- match.call(expand.dots = FALSE)$`...`
lapply(tmp, eval, envir = tmp)
}
lazyList(
a = 1,
b = 2,
c = a+b
)
#$a
#[1] 1
#
#$b
#[1] 2
#
#$c
#[1] 3
然而,显然,懒惰评估无法实现以下目标:
lazyList(
a = 1,
b = 2,
d = c * a,
c = a+b
)