Распечатать все объекты в рабочей области

Я не могу узнать, как перечислить и распечатать все объекты в рабочей области. Я хотел бы увидеть их всех и понять, что происходит. Например, ls() дает вам 30 предметов. Как, кроме ввода их по отдельности, можно отобразить их все. Кажется настолько тривиальным, решение, вероятно, будет довольно смущающим. Самый близкий я был ls.str() и идея зацикливания на объектах.

Изменить: это не для фреймов данных. У меня есть рабочее пространство, полное функций, без данных, и мне нравится понимать, какие из них ссылаются на какие и т. Д.

5 ответов

Решение

Вы имеете в виду "отображение" в смысле "для каждого объекта в 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() за то, как он обрабатывает большие объекты (но я работаю с множеством огромных (миллионы элементов) матриц, так что это мое предпочтение).

Если вам просто нужны имена переменных, которые вы используете:

ls()

Если вы хотите распечатать свои переменные вместе с содержимым, используйте команду:

mget(ls())

Это должно делать то, что вам нужно.

Для вновь открытого рабочего пространства с некоторыми матрицами, векторами и фреймами данных это хорошо работает для меня.

Я считаю, что использование RStudio позволяет мне просматривать все объекты в среде и напрямую взаимодействовать с каждым из них. Я уверен, что хорошая IDE позволит провести такое исследование, которое, по-видимому, требует ваш вопрос. Это было бы особенно полезно, чтобы дать вам представление о большом количестве объектов.

Поверьте мне: вы действительно не хотите печатать все содержимое всех ваших объектов. Просто представь распечатку matrix(1:1e5,100,1000):-( . Есть несколько полезных инструментов R, таких как summary, table, а также str которые обычно говорят вам достаточно об объекте данных, чтобы вы знали, что это такое и что вы хотите с ним делать. Если у вас есть более конкретные проблемы, например, "Какие из моих фреймов данных имеют значения NA?" Вы можете написать команды или мини-функции, чтобы сделать поиск.
Я написал несколько для себя с именами, такими как lstype(objtype='closure'), в котором перечислены все объекты обозначенного вида.

Если в вашем рабочем пространстве есть один или несколько больших объектов (например, векторов, матриц и / или списков), следующий фрагмент кода должен дать вам компактный вывод.

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) ) 
  }
}
Другие вопросы по тегам