2011-04-18 53 views
4

假设我想要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 
> 

这是正确的做法吗?我希望数组的每个元素都是一张地图。

回答

5

你称之为“阵列”的东西通常只是在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 
+0

很酷很有意义。谢谢! – user236215 2011-04-18 17:07:37

+0

OP创建数组的方式,它确实是一个数组,每个元素都有一个列表。问题在于'x [1]'中的列表没有名称,所以'x [1] [[“a”]]'返回NULL,但我们试图将一个长度为1的向量分配给一个'length 0)'指数。它可以工作,如果你做'x [1] [[1]]',但正如你所说的,如果OP直接处理列表而不是数组, – 2011-04-18 17:12:47

5

如果你真的要做到这一点,那么,因为列表中的数组的每个元素的元素没有名字,你不能用一个字符向量索引。在你的榜样,没有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 
.... 
+0

'array(list(),10)'创建一个带有dim属性的列表,因此它与列表非常相似。 – 2011-04-18 17:12:27

+1

@Joshua Yep,它创建一个数组列表hybrid - R认为它确实是一个数组('is.array(x)'是'TRUE')。我认为这个清单很整洁。 – 2011-04-18 17:15:33

+2

我不记得'is.array'是如何工作的,但'?is.array'表明它只是寻找一个长度正确的dim属性。 – 2011-04-18 17:19:19