如何在循环内访问列表的组件名称?
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]])
}
当对诸如“apply”函数之类的元素使用任何其他形式的迭代时,同样的问题也会出现。如何在不传递名称列表的情况下访问组件名称?
sapply(function(x) paste(x_variable, "is", x), l)
有没有办法直接访问这些名字?如果没有,最佳做法是什么? 谢谢。
答案 0 :(得分: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]))
}
另外,就术语而言,您调用变量的内容(a
,b
)并非真正的变量 sensu 其他编程语言。在R中,a
和b
是列表的组件。我最初对你想要的东西感到有点困惑。
使用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"