↑ arvau

Stack Overflow / How to make 'head' be applied automatically to output?

I have a bunch of large dataframes, so every time I want to display them, I have to use head:

head( blahblah(somedata) )

Typing head all the time gets old after the first few hundred times, so I'd like an easy way to do this if possible. One of the cool things about R compared to java that things like this are often really easy, if you know the secret incantation.

I searched in options, and found max.print, which almost works, except there is now a time delay.

head( blahblah(somedata) )

.... is instantaneous (to within the limits of my perception)

options(max.print=100)
blahblah(somedata)

.... takes about 3 seconds, so longer than typing head

Is there some way of making head be applied automatically when printing large data structures?

An piece of code which reproduces this behavior:

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

Stack Overflow / How to make 'head' be applied automatically to output?

Putting my comment into an answer, using the data.table package (and data.table not data.frame objects) will automatically print only the first 5 and last 5 rows (once the data.table is larger than 100 rows)

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

The data.table FAQ 2.11 deals with this explicitly.

EDIT to deal with existing data.frame objects you don't want to convert.

If you were hesitant at converting existing data.frame objects to data.table objects, you could simply define print.data.frame as 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

Stack Overflow / How to make 'head' be applied automatically to output?

I'd go along with @thelatemail's suggestion, i.e. redefine 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

A more elaborate version could line everything up together and avoid the repeated header, but you get the idea.

You could put such function in your .Rprofile or Rprofile.site files (see ?Startup) so it will be there every time you start an R session.