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