【问题标题】:List assignment for list with greater than three nesting具有大于三个嵌套的列表的列表分配
【发布时间】:2018-08-10 06:33:00
【问题描述】:

我无法找到解决此错误的方法。我之前已经实施过解决方法,但我想知道这里是否有人知道它为什么会发生。

以下没有按预期返回错误

q <- list()
q[["a"]][["b"]] <- 3
q[["a"]][["c"]] <- 4

但是,当我添加另一层嵌套时,我得到:

q <- list()
q[["a"]][["b"]][["c"]]<- 3
q[["a"]][["b"]][["d"]] <- 4

q[["a"]][["b"]][["d"]]

如果我添加第四个嵌套列表,我会得到:

q <- list()
q[["a"]][["b"]][["c"]][["d"]] <- 3
q[["a"]][["b"]][["c"]][["e"]] <- 4

*tmp*[["c"]] 中的错误:下标越界

我希望 R 为三重嵌套列表返回与四重嵌套列表相同的错误消息。

几个月前我第一次遇到这个问题。我正在运行 R 3.4.3。

【问题讨论】:

  • 奇怪的是它接受了:q[["a"]][["b"]][["c"]]&lt;- 3,但如果你接受q[["a"]][["b"]][["c"]],它会立即给出Error in q[["a"]][["b"]][["c"]] : subscript out of bounds 错误。
  • 请查看str(q)。您正在创建一个带有一个元素“a”的list。然后在随后的分配中,即[[b]] &lt;- 3,它是一个命名向量而不是一个列表。您期望的结构是什么?

标签: r list nested


【解决方案1】:

如果我们检查第一个赋值中的str(q),它是一个带有单个元素“a”的list。在随后的分配中,它正在创建一个命名向量而不是一个列表。

q <- list()
q[["a"]][["b"]] <- 3
q[["a"]][["c"]] <- 4
str(q)
#List of 1
# $ a: Named num [1:2] 3 4
#  ..- attr(*, "names")= chr [1:2] "b" "c"

is.vector(q$a)
#[1] TRUE

如果我们尝试在下一级进行赋值,它就像基于索引名称的赋值,即“b”,它是空的,并在“c”上赋值。选项是通过用list 包装值来创建list 元素

q <- list()
q[["a"]][["b"]][["c"]]<- list(3)
q[["a"]][["b"]][["d"]] <- list(4)

它返回带有 'q' 作为 list 的 1 个元素的结构,即 'a',这又是一个长度为 1 ('b') 的 list,并且当我们分配两个值 '3' 和 ' 4' 代表 'c' 和 'd',它是 2 个元素的 list

str(q)
#List of 1
# $ a:List of 1
#  ..$ b:List of 2
#  .. ..$ c:List of 1
#  .. .. ..$ : num 3
#  .. ..$ d:List of 1
#  .. .. ..$ : num 4

通过这种方式,我们可以嵌套'n'个lists

q <- list()
q[["a"]][["b"]][["c"]][["d"]] <- list(3)
q[["a"]][["b"]][["c"]][["e"]] <- list(4)

注意:目前尚不清楚预期的输出结构

【讨论】:

  • 感谢您的详细/快速回复。我相信我在早些时候通过将包含元素 c 和 d 的列表 b 分配给一个新列表 a 来解决这个问题。您的解决方案要好得多,并且可以很好地遍历表格并根据年份、月份、位置等因素制作列表。 list[[year]][[month]][[location]]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2012-06-12
相关资源
最近更新 更多