【问题标题】:Print all objects in a workspace打印工作区中的所有对象
【发布时间】:2012-05-10 02:34:39
【问题描述】:

我不知道如何列出和打印工作区中的所有对象。我想看到他们所有人并了解发生了什么。例如,ls() 为您提供 30 个对象。除了单独键入它们之外,如何将它们全部显示出来。看起来如此微不足道,解决方案可能会很尴尬。我最接近的是ls.str() 和循环对象的想法。

编辑这不适用于数据框。我有一个充满功能的工作区,没有数据,并且想了解哪些引用了哪些等。

【问题讨论】:

标签: r object workspace


【解决方案1】:

您的意思是“显示”,意思是“对于ls() 中的每个对象,我想看看如果我在提示中键入它会看到什么”?如果你有一些 1000x10000 的矩阵,你还想打印它怎么办?我个人喜欢ls.str() - 我认为它对所有内容都提供了一个很好的简洁概述,并且很好地处理了我刚才提到的情况。

但是,如果您想基本上“显示”每个对象,即在提示符上键入每个对象,我建议使用循环:

for ( obj in ls() ) { print(get(obj)) }

由于ls() 返回一个变量名的字符向量,我需要使用get(obj) 来获取名称在obj 中的变量。

您可能希望对此进行变体,以便也打印变量名称,例如

for ( obj in ls() ) { cat('---',obj,'---\n'); print(get(obj)) }

举个例子:

> a <- 1
> b <- LETTERS[1:10]
> c <- data.frame(a=LETTERS[1:10],b=runif(10))
> for ( obj in ls() ) { cat('---',obj,'---\n'); print(get(obj)) }
--- a ---
[1] 1
--- b ---
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
--- c ---
   a         b
1  A 0.1087306
2  B 0.9577797
3  C 0.8995034
4  D 0.1434574
5  E 0.3548047
6  F 0.1950219
7  G 0.1453959
8  H 0.4071727
9  I 0.3324218
10 J 0.4342141

不过,这确实有一个缺点 - 下次您调用 ls() 时,那里现在有一个 obj。不过我确信有一些解决方法。

无论如何,我认为我仍然更喜欢ls.str(),因为它处理大对象的方式(但我使用很多巨大的(数百万个元素)矩阵,所以这是我的偏好)。

【讨论】:

  • 注意:运行 for ( obj in ls() ) { print(get(obj)) } 可能会导致您的 R 被冻结,如果您与 R 进行了很长时间的会话。
  • 有没有办法只打印工作区中选定对象的列表?
【解决方案2】:

如果你只想要你使用的变量的名称:

ls()

如果您想将变量连同内容一起打印,请使用以下命令:

mget(ls())

这应该可以满足您的需求。

对于一个包含一些矩阵、向量和数据框的全新工作区,它对我来说效果很好。

【讨论】:

    【解决方案3】:

    我发现使用RStudio 可以让我查看环境中的所有对象并与每个对象直接交互。我确信一个好的 IDE 将允许您的问题似乎需要进行那种探索。这对于让您查看大量对象特别有用。

    【讨论】:

      【解决方案4】:

      相信我:您真的不想打印所有对象的所有内容。想象一下打印出 matrix(1:1e5,100,1000) :-( 。有一些有用的 R 工具,如 summarytablestr ,它们通常会告诉您有关数据对象的足够信息,以便您知道它是什么以及您想要什么与它有关。 如果您有更具体的问题,例如,“我的哪些数据框有 NA 值?” ,您可以编写命令或小函数来进行查找。
      我为自己写了一些名称,例如 lstype(objtype='closure') ,其中列出了指定种类的所有对象。

      【讨论】:

        【解决方案5】:

        如果您的工作区中有一个或多个大型对象(例如向量、矩阵和/或列表),则以下代码应该可以为您提供紧凑的输出。

        for ( obj in ls() ) { 
          cat('---',obj,'---\n');
          if ( class(get(obj)) == 'matrix'  ){
            print( get(obj)[1:min(ncol(get(obj)),10),1:min(ncol(get(obj)),10)] ) 
          }else if ( class(get(obj)) == 'numeric' |  class(get(obj)) == 'integer'  ){
            print( get(obj)[1:min(length(get(obj)),10)] )
          }else if( class(get(obj)) == 'list'){
            for (i in 1:length(get(obj))){
              if ( class(get(obj)) == 'matrix'  ){
                print( get(obj)[[i]][1:min(ncol(get(obj)[[i]]),10),1:min(ncol(get(obj)[[i]]),10)] ) 
              }else if ( class(get(obj)[[i]]) == 'numeric' |  class(get(obj)[[i]]) == 'integer'  ){
                print( get(obj)[[i]][1:min(length(get(obj)[[i]]),10)] )
              }else{
                print( get(obj)[[i]] ) 
              } 
            }
          }else{
            print( get(obj) ) 
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-02-05
          • 2016-03-06
          • 2011-11-04
          • 1970-01-01
          • 1970-01-01
          • 2011-03-03
          • 2020-02-27
          • 2018-12-28
          • 1970-01-01
          相关资源
          最近更新 更多