尝试访问R环境会产生意外结果

时间:2014-01-03 01:27:58

标签: r environment-variables

我在普通的R环境中有一堆名为Ldat.1,Ldat.2等的数据帧,我可以交互访问。

从控制台,我可以输入:

> dim(Ldat.1)[1]
[1] 40
> dim(Ldat.2)[1]
[1] 39

所以我可以说第一行有40行,第二行有39行。

但是,有几十个数据框,我想编写一个脚本来告诉我每帧中有多少行。

我尝试了以下内容:

print(dim(Ldat.1)[1])
print(dim(Ldat.2)[1])
for (i in 1:2){
  namex<-paste("Ldat.",i,sep="")
  size<-dim(.GlobalEnv$namex)
  print(size[1])
}

并且控制台显示:

> print(dim(Ldat.1)[1])
[1] 40
> print(dim(Ldat.2)[1])
[1] 39
> for (i in 1:2){
+   namex<-paste("Ldat.",i,sep="")
+   size<-dim(.GlobalEnv$namex)
+   print(size[1])
+ }
NULL
NULL

构造字符串很容易:

for (i in 1:2){
  namex<-paste("Ldat.",i,sep="")
  size<-dim(namex)
  print(namex)
}

产生

> for (i in 1:2){
+   namex<-paste("Ldat.",i,sep="")
+   size<-dim(namex)
+   print(namex)
+ }
[1] "Ldat.1"
[1] "Ldat.2"

但是尽管尝试了“as.data.frame”和“envir =”的各种组合,我似乎无法让R将字符串“Ldat.1”解释为可从控制台访问的对象的名称。

提前致谢。

2 个答案:

答案 0 :(得分:4)

1)这将列出每个数据框的名称及其拥有的行数:

sapply(Filter(is.data.frame, mget(ls())), nrow)

如果我们已经有nms数据帧名称的向量,那么我们可以将其减少为:

nms <- c("Ldat.1", "Ldat.2")
sapply(mget(nms), nrow)

2)这是另一种方式:

simplify2array(Filter(Negate(is.null), eapply(.GlobalEnv, nrow)))

3)还可以尝试R.oo包中的ll函数。

答案 1 :(得分:2)

请改为尝试:

for (i in 1:2){
   namex<-paste("Ldat.",i,sep="")
   size<-dim(.GlobalEnv[[namex]])
   print(size[1])
               }

这个问题与环境无关,而且与$不评估其第二个参数的事实有关(它的第一个参数是它前面的标记名,.GlobalEnv在这种情况下)。名为“namex”的.GlobalEnv中没有对象。另一方面,“[[”执行评估步骤,因此{for {-}}(在for循环的第一次传递期间为“Ldat.1”)的值将被替换,查找将成功。