R - 从for循环返回一个对象名

时间:2013-05-31 18:54:00

标签: r for-loop

使用如下基本功能:

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]))

然后为每个数据帧的第一列提供一个表。

我包括这个因为它是问题的动力。我需要能够为正在检查的每个数据帧标记数据。

2 个答案:

答案 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")