2011-09-29 47 views
14

向列表中添加一個已命名的項目時,是否保證該項目將被添加到列表的末尾?在實踐中似乎是這樣,但不確定這是否是一個危險的假設?添加命名的項目到命名列表 - 保證追加到列表的末尾?

test = list() 
test[[ "one" ]] = 1 
test[[ "two" ]] = 2 # will always appear after "one"? 
test[[ "three" ]] = 3 # will always appear after "two"? 
+0

要清楚的是,您正在使用字符串鍵'[['one']]'或'[['1']]'不是數字鍵'[[1]]'。我們可以把它所有的字符串鍵都按照整理順序嗎?你能像'[['1']]'而不是'[['one']]'這樣的字符串鍵嗎? – smci

回答

20

如果它沒有記錄(它似乎不是),那麼我不會依賴它。你可以確保它做類似的東西出現在列表的末尾:

test <- list() 
test <- c(test, one=1) 
test <- c(test, two=2) 
test <- c(test, three=3) 
+2

但要非常小心如何添加東西到列表中。看看'Rgames:tl < - list()的結果' 'Rgames:tl [[1]] < - list(one = 1)' 'Rgames:tl [[2]] < - data.frame兩個= 2)' '遊戲:tl $ 3 < - 3' –

+0

@CarlWitthoft:對於'tl [['2']]'和'tl [[2]]',即字符串鍵OP的確是)vs數字鍵 – smci

+1

'append(test,list(three = 3))'是另一個選項 – baptiste

3

我懷疑,如果你深入研究R的C代碼,那麼你會看到,它是真實的,但約書亞表示,其沒有記錄。您可以向R-dev詢問是否記錄此類行爲應該的意見。可能已經存在依賴於它的現有代碼。

+2

Spacedman - 建議R-dev將它記錄下來。謝謝! – SFun28

+3

嗯......我很難看到列表(或數據框或矢量)的新元素如何放在任何地方,但在「結尾」。當你定義一個元素的時候,它會被分配一個未使用的位置。強調「未使用」。這應該是顯而易見的,例如將第三項添加到具有兩個元素的列表中將不會將其分配給第47個位置。 –

+2

我同意把一個元素放在一個長度爲12的列表中的第7位將是不正當的,但爲什麼結束,而不是開始?當您按名稱添加元素時,您不會提供任何位置信息,因此除非有文檔記錄,否則該語言可以隨意放置。某些語言最終可能會使用字符串鍵的散列值進行排序。 – Spacedman