4

我想创建一个嵌套列表,例如,

> L <- NULL
> L$a$b <- 1
> L
$a
$a$b
[1] 1

由于我需要在循环中进行赋值,因此我必须使用括号而不是美元,例如,

> L <- NULL
> a <- "a"
> b <- "b"
> L[[a]][[b]] <- 1
> L
a 
1
> b <- "b1"
> L[[a]][[b]] <- 1
Error in L[[a]][[b]] <- 1 : 
  more elements supplied than there are to replace

这出乎我的意料:L 变成了一个命名向量,而不是一个嵌套列表。但是如果赋值是一个长度超过1的向量,问题就会消失,

> L <- NULL
> L[[a]][[b]] <- 1:2
> L
$a
$a$b
[1] 1 2
> b <- "b1"
> L[[a]][[b]] <- 1
> L
$a
$a$b
[1] 1 2

$a$b1
[1] 1

我的大多数作业都比 1 长,这就是我的代码看似有效但有时会奇怪地失败的原因。我想知道是否有任何方法可以解决这种意外行为,谢谢。

4

2 回答 2

5

你可以明确地说每件事都应该是它自己的清单

> L <- list()
> L[[a]] <- list()
> L[[a]][[b]] <- 1
> L
$a
$a$b
[1] 1

但如果你解释你的实际目标,听起来可能有更好的方法来做你想做的事。

于 2013-08-25T14:53:58.383 回答
2

见帮助(“[[”)

当 $<- 应用于 NULL x 时,它首先将 x 强制为 list()。如果替换值值的长度大于 1,[[<- 也会发生这种情况:如果值的长度为 1 或 0,则 x 首先被强制转换为值类型的零长度向量。

于 2013-08-25T20:04:50.683 回答