Как заставить "голову" автоматически применяться к выводу?

У меня есть куча больших фреймов данных, поэтому каждый раз, когда я хочу их отобразить, я должен использовать 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))

2 ответа

Решение

Я согласился бы с предложением @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.

Положив мой комментарий в ответ, используя data.table пакет (и data.table не data.frame объекты) будет автоматически печатать только первые 5 и последние 5 строк (если data.table больше 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 по data.table 2.11 имеет дело с этим явно.


РЕДАКТИРОВАТЬ, чтобы иметь дело с существующими 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
Другие вопросы по тегам