如何在分配给新变量后访问变量/组件名称

时间:2016-07-07 22:30:32

标签: r loops lapply

如何在循环内访问列表的组件名称?

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)

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

1 个答案:

答案 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]))
}

另外,就术语而言,您调用变量的内容(ab)并非真正的变量 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"