r中的列表数组

use*_*215 5 arrays r map

假设我想要10个元素数组,每个元素都是一个列表/映射.我这样做:

x = array(list(), 10)
x[1][[ "a" ]] = 1
Warning message:
In x[1][["a"]] = 1 :
  number of items to replace is not a multiple of replacement length
>
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?我希望数组的每个元素都是一个映射.

Jos*_*ich 5

你称之为"数组"的东西通常在R中被称为列表.你会因为列表之间的差异[而被绊倒[[.请参阅中的"递归(类似列表)对象"部分help("[").

x[[1]][["a"]] <- 1
Run Code Online (Sandbox Code Playgroud)

更新:
请注意,上面的解决方案创建了一个命名向量列表.换句话说,就像

x[[1]][["a"]] <- 1
x[[1]][["b"]] <- 1:2
Run Code Online (Sandbox Code Playgroud)

将无法工作,因为您无法将多个值分配给向量的一个元素.如果您希望能够为名称指定矢量,则可以使用列表列表.

x[[1]] <- as.list(x[[1]])
x[[1]][["b"]] <- 1:2
Run Code Online (Sandbox Code Playgroud)


Rei*_*son 5

如果你真的想这样做,那么,因为数组的每个元素中的列表元素没有名称,所以不能用字符向量索引.在您的示例中,没有x[1][[ "a" ]]:

> x[1][[ "a" ]]
NULL
Run Code Online (Sandbox Code Playgroud)

如果没有名称,那么您需要通过数字索引:

> x[1][[ 1 ]] <- 1
[1] 1
Run Code Online (Sandbox Code Playgroud)

拥有列表而不是数组似乎更合乎逻辑:

> y <- vector(mode = "list", length = 10)
> y
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL
....
Run Code Online (Sandbox Code Playgroud)

  • 我不记得`is.array`是如何工作的,但是`?is.array`表明它只是寻找一个长度为正的昏暗属性. (2认同)