动态列表创建

时间:2012-11-03 15:39:11

标签: r

我对R动态创建列表的方式感到烦恼,我希望有人可以帮助我了解正在发生的事情以及如何修复我的代码。我的问题是,对于长度为1的向量的赋值,指定了一个命名向量,但是长度大于一的向量的赋值,则分配了一个列表。我期望的结果是无论我指定的向量的长度如何都分配列表。我如何实现这样的结果?

例如,

types <- c("a", "b")
lst <- vector("list", length(types))
names(lst) <- types
str(lst)
List of 2
 $ a: NULL
 $ b: NULL
lst$a[["foo"]] <- "hi"
lst$b[["foo"]] <- c("hi", "SO")
str(lst)
List of 2
 $ a: Named chr "hi"
  ..- attr(*, "names")= chr "foo"
 $ b:List of 1
  ..$ foo: chr [1:2] "hi" "SO"
str(lst$a)
 Named chr "hi"
 - attr(*, "names")= chr "foo"
str(lst$b)
List of 1
 $ foo: chr [1:2] "hi" "SO"

我希望得到的结果是一个看起来像这样的数据结构。

List of 2
 $ a:List of 1
  ..$ foo: chr [1] "hi"
 $ b:List of 1
  ..$ foo: chr [1:2] "hi" "SO"

2 个答案:

答案 0 :(得分:3)

虽然我也觉得它令人惊讶,但在?[[

中有记录
  

递归(类似列表)对象:

 [...]

 When ‘$<-’ is applied to a ‘NULL’ ‘x’, it first coerces ‘x’ to
 ‘list()’.  This is what also happens with ‘[[<-’ if the
 replacement value ‘value’ is of length greater than one: if
 ‘value’ has length 1 or 0, ‘x’ is first coerced to a zero-length
 vector of the type of ‘value’.

要覆盖该行为,您可以在动态分配之前专门创建空列表:

lst$a <- list()
lst$b <- list()

或者像Josh在下面建议的那样,将您的lst <- vector("list", length(types))替换为lst <- replicate(length(types), list())

现在‘x’lst$alst$b)不是‘NULL’而是一个空列表,您的代码应该按预期工作:

lst$a[["foo"]] <- "hi"
lst$b[["foo"]] <- c("hi", "SO")
str(lst)
# List of 2
#  $ a:List of 1
#   ..$ foo: chr "hi"
#  $ b:List of 1
#   ..$ foo: chr [1:2] "hi" "SO"

答案 1 :(得分:2)

我认为你只需要创建你想要的类型并分配它们:

R> qq <- list( a=list(foo="Hi"),  b=list(foo=c("Hi", "SO")))
R> qq
$a
$a$foo
[1] "Hi"


$b
$b$foo
[1] "Hi" "SO"


R> 

满足您的所有要求:

R> class(qq)
[1] "list"
R> names(qq)
[1] "a" "b"
R> sapply(qq, names)
    a     b 
"foo" "foo" 
R>