Печать всех объектов в рабочей области

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

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

Ответы

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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