【问题标题】:Loop over objects in global environment [duplicate]在全局环境中循环对象[重复]
【发布时间】:2018-12-23 09:41:03
【问题描述】:

我对 R 很陌生,并试图为一个简单的任务编写一个循环或简洁的代码:检查 R 中我的全局环境中所有当前对象的类。

class(mydata)
#[1] "data.frame"
class(mylist)
#[1] "list"
class(mymatrix)
#[1] "matrix"
...

以下代码有效,但是如果我有很多对象并且不想输入所有名称怎么办。

dflist <- list(mydata, mylist, mymatrix)
lapply(dflist,class)

我尝试了以下方法,但都没有奏效。

 #1
for (i in ls()){
  class(i)
}

 #2
for (i in ls()){
  lapply(i,class)
}

有什么解决办法吗?谢谢。

【问题讨论】:

  • 如果您是 R 新手,这听起来不像是您应该做的事情。您想要实现什么目标?
  • @JackBrookes 我想练习在 R 中编写循环。对于这个特定的示例,我想获取当前环境中所有数据帧的类。
  • @zx8754 谢谢!希望我早点看到那个帖子。 eapply(.GlobalEnv,class) 对我有用。

标签: r loops for-loop environment-variables global-variables


【解决方案1】:

您可以使用mget,它返回“一个命名的对象列表”。函数的第一个参数应该是对象名称的字符向量,这是ls() 返回的内容。

lapply(mget(ls()), class)
#$mydata
#[1] "data.frame"
# 
#$mylist
#[1] "list"
#
#$mymatrix
#[1] "matrix"

【讨论】:

    【解决方案2】:

    试试eapply:

    eapply(.GlobalEnv, class)
    

    【讨论】:

      【解决方案3】:

      使用sapply:

      sapply(ls()[sapply(ls(), function(x) any(class(get(x)) %in% c("data.frame", "matrix", "list")))], function(x) class(get(x)))
      

      【讨论】:

      • 谢谢。但它返回值中对象(向量)的所有类,但不返回我环境中数据部分中的对象(数据框、矩阵、列表)。
      • 谢谢!!! @markus 的代码更短(更优化)。
      • @markus 代码适用于所有对象。我调整了代码,以便可以排除向量。
      • 你是对的。谢谢!不知怎的,我觉得它仍然可以优化。
      猜你喜欢
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2018-10-27
      • 2020-07-24
      • 2022-11-22
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多