禁止向R控制台输出大量输出

时间:2014-06-23 19:03:55

标签: r console output

如何让R检查对象是否太大而无法在控制台中打印? "太大"这意味着大于用户定义的值。

示例:您有一个列表f_data,其中包含两个元素f_data$data(100MB data.frame)和f_data$info(例如,一个向量)。假设您要检查f_data$data data.frame的前几个条目,但是您输错了并输入head(f_data)而不是head(f_data$data)。 R将尝试将f_data的全部内容打印到控制台(这将永远需要)。 有没有我可以设置的选项,以便抑制大于让我们说1MB的对象的输出?

编辑:谢谢你们的帮助。在实现max.rows选项后,我意识到这确实提供了所需的输出。但输出需要很长时间才能显示的问题仍然存在。我将在下面给你一个恰当的例子。

df_nrow=100000
df_ncol=100
#create list with first element being a large data.frame
#second element is a short vector
test_list=list(df=data.frame(matrix(rnorm(df_nrow*df_ncol),nrow=df_nrow,ncol=df_ncol)),
               vec=1:110)

#only print the first 100 elements of an object
options(max.print=100)

#head correctly displays the first row of the data.frame
#BUT for some reason the output takes really long to show up in the console (~30sec)
head(test_list)
#let's try to see how long exactly
system.time(head(test_list))
#   user  system elapsed 
#      0       0       0
#well, obviously system.time is not the proper tool to measure this

#the same problem if I just print the object to the console without using head
test_list$df

我假设R对正在打印的对象执行某种分析,这需要很长时间。

编辑2: 根据下面的评论,如果我使用matrix代替data.frame,我会检查问题是否仍然存在。

#create list with first element being a large MATRIX
test_list=list(mat=matrix(rnorm(df_nrow*df_ncol),nrow=df_nrow,ncol=df_ncol),vec=1:110)

#no problem
head(test_list)

#no problem
test_list$mat

可能是data.frame对象没有真正有效地实现控制台的输出吗?

2 个答案:

答案 0 :(得分:1)

我认为没有这样的选项,但您可以使用object.size检查对象的大小,如果低于阈值(以字节为单位),则打印它,例如:

print.small.objects <- function(x, threshold = 1e06, ...)
{
  if (object.size(x) < threshold) {
    print(x, ...)
  } else {
    cat(paste("too big object\n"))
    print(object.size(x))
  }
}

答案 1 :(得分:1)

这是一个可以调整到100MB的示例。如果对象的大小超过8e5字节,它基本上只打印前6行和5列。您也可以将其转换为函数并将其放在.Rprofile

> lst <- list(data.frame(replicate(100, rnorm(1000))), 1:10)
> sapply(lst, object.size)
# [1] 810968     88
> lapply(lst, function(x){
      if(object.size(x) > 8e5) head(x)[1:5] else x
  })
#[[1]]
#          X1         X2          X3          X4         X5
#1  0.3398235 -1.7290077 -0.35367971  0.09874918 -0.8562069
#2  0.2318548 -0.3415523 -0.38346083 -0.08333569 -1.1091982
#3  0.0714407 -1.4561768  0.50131914 -0.54899188  0.1652095
#4 -0.5170228  1.7343073 -0.05602883  0.87855313  0.4025590
#5  0.6962212 -0.3179930  0.28016057  1.05414456 -0.5172885
#6  0.9471200  1.4424843 -1.46323827 -0.78004192 -1.3611820
#
#[[2]]
# [1]  1  2  3  4  5  6  7  8  9 10