2014-03-05 88 views
0

我面临的问题是我似乎无法获得正确形式的字典。我要附加到第一的嵌套列表元素,以便例如我可以有:在R中追加嵌套字典

mylist[[index]] <- list("TSI" <- list(), "type"=mytype) 

我那么喜欢的元素添加到字典TSI让我有:

mylist[[index]][["TSI"]] <- list(mylist[[index]][["TSI"]], key=value) 

但是当我继续这样做,即

mylist[[index]][["TSI"]] <- list(mylist[[index]][["TSI"]], '2'=200) 
mylist[[index]][["TSI"]] <- list(mylist[[index]][["TSI"]], '3'=300) 

我发现,当我这样做,我没有得到一个列表和字典/列表我试图建立只含一个值。

正如答案建议我已经试过这是一个循环的情况如下:

# type is some kind of string i.e. "3" 
    # myTSI is a value i.e. 400 
    # index is a value i.e. 1 
    mylist[[index]][["TSI"]] <- c(mylist[[index]][["TSI"]], type=myTSI) 

指数没有这种情况发生变化,但类型不会,所以理想情况下应该建立一系列条目中mylist[[index]][["TSI"]]其中mylist[[index]][["TSI"]][["6"]]给出了该类型的myTSI。然而在退出循环,我打字的时候只是得到:

mylist[[index]][["TSI"]] 

我得到以下

type 
"648746" 

但没有字典列表。这是奇怪的,因为如果我做的环以下几点:

mylist[[index]][["TSI"]] <- c(mylist[[index]][["TSI"]], "3"=100) 
mylist[[index]][["TSI"]] <- c(mylist[[index]][["TSI"]], "4"=400) 

打印mylist[[index]][["TSI"]]

,当我得到

3 4 
100 400 

不能工作了,为什么是这种情况。

+1

的问题是'“TSI” < - 名单()':最好的办法是沿着以下线在你的第一个命令。这不会创建名为“TSI”的列表条目,而是将空列表绑定到符号“TSI”,然后该空列表将成为mylist [[index]]中的第一个(未命名!)条目。然后,当你尝试访问mylist [[index]] [[“TSI”]]'列表中的条目不存在时,返回一个'NULL'对象,然后向其追加一个名为''的列表条目2',值为200.如果你在第一行输入mylist [[index]] < - list(“TSI”= list(),“type”=“mytype”)',你的代码将按预期工作。 – fabians

+2

@Navonod请不要问同样的问题两次 - 如果需要,你可以编辑你的问题。由于这个问题现在有一个答案,我已经投票关闭了以前的版本。 http://stackoverflow.com/q/22193805/134830 –

+0

@RichieCotton,我应该试图先删除其他人。同意。谢谢。 – disruptive

回答

1

你所寻找的是这样的结构,其中l是类型列表:

l = c(l, list(key=value)) 

这将concatinate两个列表在一起。

R实现了写入时复制范例,因此,将元素递增地附加到列表将极其低效。即使我的上述建议效率低下,因为它遭受同样的问题。每次

tsi = lapply(some_data, some_function_to_populate_list) 
mylist[[index]]$TSI = tsi 

这样可以避免复制mylist和你的嵌套列表,你的广告元素

+0

谢谢。我正在尝试,但似乎我遇到了麻烦,我只是不知道字典/列表不追加。我在上面写了更多,在上面的问题中获得更多评论。这似乎是好的,当我硬键入值,我得到了追加,但当通过循环,与key:值变量不起作用。 – disruptive

+0

@Navonod想象你有'l = list(a = 1,b = 2)',那么我期望'l = list(l,c = 3)'的结果如下:'[[a = 1,b = 2],c = 3]',即第一个元素未命名的嵌套列表。你似乎想要的是'[a = 1,b = 2,c = 3]',这是一个连接并且通过在两个列表中使用'c'来实现,因此将值'c = 3'放入一个新列表你应该有:'l = c(l,list(c = 3))'导致'[a = 1,b = 2,c = 3]'。这是我的上述答案。或者,如果一次仅添加一个值,则可以直接将其设置到列表中:'name =“c”; l [[name]] = 3'。两种方法都不是最理想的。 –

+0

谢谢但[[index]] [[type]] [[name]] = 3'方法不起作用,奇怪的是,尽管遍历循环N次,但只有最后一个名字被压入字典/列表中并获得N个不同的“名称”和价值观。所以如果我打印'[[index]] [[type]]'我没有得到关键值对。 – disruptive