防止R嵌套列表被转换为命名向量

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,这就是为什么我的代码看起来工作正常,但有时会出现奇怪的失败情况。我想知道是否有任何方法可以修复这种意外行为,谢谢。


看起来像是一个错误,或者至少在赋值函数中有一些奇怪的东西。请注意以下两者之间的区别:L <- list(); L$a$b <- 1; is(L$a)M <- list(); M[["a"]][["b"]] <- 1; is(M$a) - Ferdinand.kraft
最令人惊讶的是,在设置 L[[a]][[b]] <- 1 后,获取 L[[a]][[b]] 将会出现错误。 - flodel
@flodel,你使用a还是"a"?我使用字符串没有出现错误。 - Ferdinand.kraft
2个回答

5
你可以明确地表示每个事物应该有自己的列表。
> L <- list()
> L[[a]] <- list()
> L[[a]][[b]] <- 1
> L
$a
$a$b
[1] 1

但是,如果您解释一下您的实际目标,似乎有更好的方法来完成您想要的事情。


实际上,我想要存储分析结果(不同长度的字符向量)。为了进行分析,我有几个步骤,比如步骤a和b,对于每个步骤,我使用不同的方法,比如a1、a2...和b1、b2...最后,我想将它们存储在嵌套列表中。使用这样的列表结构有利于通过循环进行后续分析、格式化和保存,同时使我的工作空间更加紧凑和整洁。谢谢。 - foehn
如果有一个答案对您最有帮助,请随意点击该答案旁边的“勾选标记”,表示该答案对您最有帮助。 - Dason

2

请查看help("[[")

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


这解释了发生了什么,但没有说明如何修复它。 - Dason
@Sobala,啊,我明白了,抱歉没有看帮助文件。谢谢。 - foehn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接