在其'中使用列表元素定义

时间:2017-04-04 08:40:37

标签: r

我对R有一个相对简单的问题,我希望我们能找到解决方案。

我的目标是定义以下列表,其中c元素应该是先前定义的ab元素的总和:

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
         )

不幸的是,我对上述解决方案不感兴趣。有没有办法在列表定义中进行总结?

2 个答案:

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