2016-07-07 52 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)有什麼優勢? 您的解決方案是更快還是更高效? 謝謝。 –