使用如下基本功能:
myname<-function(z){
nm <-deparse(substitute(z))
print(nm)
}
在迭代列表时,我想要打印(或返回)项目的名称。
for (csv in list(acsv, bcsv, ccsv)){
myname(csv)
}
应打印:
acsv
bcsv
ccsv
(而不是csv)。
应该注意的是,acsv,bcsv和ccsvs都是从csvs读入的数据帧,即
acsv = read.csv("a.csv")
bcsv = read.csv("b.csv")
ccsv = read.csv("c.csv")
修改 我最终使用了一点妥协。这样做的主要目的不是简单地打印框架名称 - 这就是问题,因为它是做其他事情的先决条件。
我需要在四个格式相同的文件上运行相同的功能。然后我使用了这种语法:
for(i in 1:length(csvs)){
cat(names(csvs[i]), "\n")
print(nrow(csvs[[i]]))
print(nrow(csvs[[i]][1]))
}
然后利用嵌套列表的索引,例如
print(nrow(csvs[[i]]))
显示每个数据帧的行数。
打印(nrow(CSV的[[I]] [1]))
然后为每个数据帧的第一列提供一个表。
我包括这个因为它是问题的动力。我需要能够为正在检查的每个数据帧标记数据。
答案 0 :(得分:2)
你构建的list
不再“记住”它构造的表达式了。但您可以使用自定义构造函数:
named.list <- function(...) {
l <- list(...)
exprs <- lapply(substitute(list(...))[-1], deparse)
names(l) <- exprs
l
}
所以:
> named.list(1+2,sin(5),sqrt(3))
$`1 + 2`
[1] 3
$`sin(5)`
[1] -0.9589243
$`sqrt(3)`
[1] 1.732051
将此列表用作names
的参数,如托马斯suggested:
> names(mylist(1+2,sin(5),sqrt(3)))
[1] "1 + 2" "sin(5)" "sqrt(3)"
要了解这里发生了什么,让我们分析以下内容:
> as.list(substitute(list(1+2,sqrt(5))))
[[1]]
list
[[2]]
1 + 2
[[3]]
sqrt(5)
[-1]
索引会遗漏第一个元素,所有剩余的元素都会传递给deparse
,因为...... {/ p>
> lapply(as.list(substitute(list(1+2,sqrt(5))))[-1], class)
[[1]]
[1] "call"
[[2]]
[1] "call"
请注意,您无法“重构”list(...)
内的来电substitute()
,只能使用l
。你知道为什么吗?
我也想知道这个功能是否已经在其中一个无数R套件中可用。我发现William Dunlap this post有效地暗示了同样的方法。
答案 1 :(得分:1)
我不知道你的数据是什么样的,所以这里有一些东西:
csvs <- list(acsv=data.frame(x=1), bcsv=data.frame(x=2), ccsv=data.frame(x=3))
for(i in 1:length(csvs))
cat(names(csvs[i]), "\n")