Печать всех объектов в рабочей области
Я не могу узнать, как перечислить и распечатать все объекты в рабочей области. Я хотел бы увидеть их всех и понять, что происходит. Например, 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) )
}
}