2011-09-29 49 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