假设我想要10个元素数组,每个元素都是一个列表/地图。我这样做:r中的列表数组
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
>
这是正确的做法吗?我希望数组的每个元素都是一张地图。
假设我想要10个元素数组,每个元素都是一个列表/地图。我这样做:r中的列表数组
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
>
这是正确的做法吗?我希望数组的每个元素都是一张地图。
你称之为“阵列”的东西通常只是在R中被称为列表。你被列表中的[
和[[
之间的差异绊倒了。请参阅help("[")
中的“递归(类列表)对象”一节。
x[[1]][["a"]] <- 1
UPDATE:
需要注意的是上述方案中创建一个名为向量的列表。换句话说,像
x[[1]][["a"]] <- 1
x[[1]][["b"]] <- 1:2
将无法正常工作,因为您不能将多个值分配给向量的一个元素。如果你想能够为一个名字赋一个向量,你可以使用一个列表列表。
x[[1]] <- as.list(x[[1]])
x[[1]][["b"]] <- 1:2
如果你真的想要做到这一点,那么,因为列表中的数组的每个元素的元素没有名字,你不能用一个字符向量索引。在你的榜样,没有x[1][[ "a" ]]
:
> x[1][[ "a" ]]
NULL
如果没有名字,那么你需要指数数值:
> x[1][[ 1 ]] <- 1
[1] 1
这似乎更符合逻辑有一个列表,虽然不是数组:
> y <- vector(mode = "list", length = 10)
> y
[[1]]
NULL
[[2]]
NULL
[[3]]
NULL
[[4]]
NULL
[[5]]
NULL
....
'array(list(),10)'创建一个带有dim属性的列表,因此它与列表非常相似。 – 2011-04-18 17:12:27
@Joshua Yep,它创建一个数组列表hybrid - R认为它确实是一个数组('is.array(x)'是'TRUE')。我认为这个清单很整洁。 – 2011-04-18 17:15:33
我不记得'is.array'是如何工作的,但'?is.array'表明它只是寻找一个长度正确的dim属性。 – 2011-04-18 17:19:19
很酷很有意义。谢谢! – user236215 2011-04-18 17:07:37
OP创建数组的方式,它确实是一个数组,每个元素都有一个列表。问题在于'x [1]'中的列表没有名称,所以'x [1] [[“a”]]'返回NULL,但我们试图将一个长度为1的向量分配给一个'length 0)'指数。它可以工作,如果你做'x [1] [[1]]',但正如你所说的,如果OP直接处理列表而不是数组, – 2011-04-18 17:12:47