如何使'head'自动应用于输出?

Hug*_*ins 6 r

我有一堆大型数据帧,所以每次我想显示它们时,我都要使用head:

head( blahblah(somedata) )
Run Code Online (Sandbox Code Playgroud)

在最初的几百次之后,打字头一直变老,所以如果可能的话,我想要一个简单的方法来做到这一点.与java相比,R的一个很酷的事情就是这样的事情通常很容易,如果你知道秘密咒语.

我在选项中搜索,发现max.print,几乎可以工作,除了现在有时间延迟.

head( blahblah(somedata) )
Run Code Online (Sandbox Code Playgroud)

....是瞬间的(在我的感知范围内)

options(max.print=100)
blahblah(somedata)
Run Code Online (Sandbox Code Playgroud)

....大约需要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))
Run Code Online (Sandbox Code Playgroud)

mne*_*nel 7

将我的评论放入答案中,使用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
Run Code Online (Sandbox Code Playgroud)

data.table FAQ 2.11明确地处理了这个问题.


编辑以处理data.frame您不想转换的现有对象.

如果您对将现有data.frame对象转换为data.table对象犹豫不决,可以简单地定义print.data.framedata.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
Run Code Online (Sandbox Code Playgroud)


flo*_*del 5

我会同意@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
Run Code Online (Sandbox Code Playgroud)

一个更精细的版本可以将所有内容排列在一起并避免重复的标题,但你明白了.

您可以将这样的功能放在您的.RprofileRprofile.site文件中(请参阅参考资料?Startup),以便每次启动R会话时它都会存在.