2011-04-18 54 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