2016-07-07 51 views
0

如何访问循环内列表的组件名称?如何在分配给新变量后访问变量/组件名称

for(v in list(a=1, b=2)){ 
    paste(variable_name(v),"is",v) 
    ## to print a is 1 and b is 2 
} 

我知道下面的代码工作,但我想应该有一个更好的办法:

l <- list(a=1, b=2) 
for(vName in ls(l)){ 
     paste(vName, "is", l[[vName]]) 
} 

使用迭代的其他任何形式的元素,如“应用”功能时,同样的问题上升。如何在不传递名称列表的情况下访问组件名称?

sapply(function(x) paste(x_variable, "is", x), l) 

有没有办法直接访问名称?如果不是,最佳做法是什么? 谢谢。

+0

我今天接受了答案。昨天我不能。谢谢。 –

+0

@ZheyuanLi现在实际上已经皱起了眉头(在接受条件下提供帮助)。用户不必接受答案。 –

+2

@AliKhosro只是供参考,但我看了,你还没有接受任何答案,但你需要点击大滴答接受。请注意,您不必接受任何内容,但正如您所表示的那样,您已经接受了答案,但这并未显示出来,我想我会提及它。请参阅[Tour](http://stackoverflow.com/tour)例如 –

回答

1

我觉得你只是想names():现在

ll <- list(a=1, b=2) 
for(v in seq_along(ll)){ 
    writeLines(paste(names(ll)[v], "is", ll[v])) 
} 

> ll <- list(a=1, b=2) 
> for(v in seq_along(ll)){ 
+  writeLines(paste(names(ll)[v], "is", ll[v])) 
+ } 
a is 1 
b is 2 

注意在列表中的元素(这是我指定为ll循环外)指数,我循环,而不是元素本身。你也可能不想叫names()很多次了,所以你应该概括了未来的环太:

ll <- list(a=1, b=2) 
nams <- names(ll) 
for(v in seq_along(ll)){ 
    writeLines(paste(nams[v], "is", ll[v])) 
} 

此外,刚上的术语,你的东西在呼唤变量(ab)AREN” t真的变量sensu其他编程语言。在R中,ab组件的列表。我对你最初想要的东西有点困惑。

sapply()这样做有点小技巧,但同样的想法起作用:遍历对象元素/组件的索引而不是元素/组件本身。

sapply(seq_along(ll), 
     function(i, list, names) paste(names[i], "is", list[i]), 
     list = ll, names = nams) 

> sapply(seq_along(ll), 
+  function(i, list, names) paste(names[i], "is", list[i]), 
+  list = ll, names = nams) 
[1] "a is 1" "b is 2" 
+0

谢谢你的回答。我有两个新问题: 1)如果我们有环境而不是列表,该怎么办?环境不可子集化。 2)你的解决方案对sapply(名称(ll),函数(x,列表)paste(x,“is”,list [x]),list = ll)有什么优势? 您的解决方案是更快还是更高效? 谢谢。 –