Как заставить "голову" автоматически применяться для вывода?
У меня есть куча больших фреймов данных, поэтому каждый раз, когда я хочу их отображать, я должен использовать head
:
head( blahblah(somedata) )
Набирающая голова все время стареет после первых нескольких сотен раз, поэтому мне хотелось бы сделать простой способ сделать это, если это возможно. Одна из интересных вещей о R по сравнению с java, что такие вещи часто бывают очень легкими, если вы знаете секретное заклинание.
Я искал в параметрах и нашел max.print
, который почти работает, за исключением того, что есть временная задержка.
head( blahblah(somedata) )
.... мгновенно (в пределах моего восприятия)
options(max.print=100)
blahblah(somedata)
.... занимает около 3 секунд, поэтому дольше, чем печатать head
Есть ли способ сделать head
автоматически применяться при печати больших структур данных?
Кусок кода, который воспроизводит это поведение:
long_dataset = data.frame(a = runif(10e5),
b = runif(10e5),
c = runif(10e5))
system.time(head(long_dataset))
options(max.print = 6)
system.time(print(long_dataset))
Ответы
Ответ 1
Я бы согласился с предложением @thelatemail, то есть переопределить print.data.frame
:
print.data.frame <- function(df) {
if (nrow(df) > 10) {
base::print.data.frame(head(df, 5))
cat("----\n")
base::print.data.frame(tail(df, 5))
} else {
base::print.data.frame(df)
}
}
data.frame(x=1:100, y=1:100)
# x y
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
# 5 5 5
# ----
# x y
# 96 96 96
# 97 97 97
# 98 98 98
# 99 99 99
# 100 100 100
Более сложная версия может объединить все вместе и избежать повторного заголовка, но вы получите эту идею.
Вы можете поместить такую функцию в свои файлы .Rprofile
или Rprofile.site
(см. ?Startup
), чтобы она была там всякий раз, когда вы запускаете сеанс R.
Ответ 2
Поместив мой комментарий в ответ, с помощью пакета data.table
(и data.table
not data.frame
) будет автоматически печататься только первые 5 и последние 5 строк (как только таблица данных больше 100 строк)
library(data.table)
DT <- data.table(long_data)
DT
1: 0.19613138 0.88714284 0.25715067
2: 0.25405787 0.76544909 0.75632468
3: 0.24841384 0.22095875 0.52588596
4: 0.72766161 0.79696771 0.88802759
5: 0.02448372 0.77885568 0.38199993
---
999996: 0.28230967 0.09410921 0.84420162
999997: 0.73598931 0.86043537 0.30147089
999998: 0.86314546 0.90334347 0.08545391
999999: 0.85507851 0.46621131 0.23892566
1000000: 0.33172155 0.43060483 0.44173400
Таблица данных FAQ 2.11 касается этого явно.
EDIT для работы с существующими объектами data.frame
, которые вы не хотите преобразовывать.
Если вы не решались преобразовать существующие объекты data.frame
в объекты data.table
, вы могли бы просто определить print.data.frame
как data.table:::print.data.table
print.data.frame <- data.table:::print.data.table
long_dataset
1: 0.19613138 0.88714284 0.25715067
2: 0.25405787 0.76544909 0.75632468
3: 0.24841384 0.22095875 0.52588596
4: 0.72766161 0.79696771 0.88802759
5: 0.02448372 0.77885568 0.38199993
---
999996: 0.28230967 0.09410921 0.84420162
999997: 0.73598931 0.86043537 0.30147089
999998: 0.86314546 0.90334347 0.08545391
999999: 0.85507851 0.46621131 0.23892566
1000000: 0.33172155 0.43060483 0.44173400