如何让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
对象没有真正有效地实现控制台的输出吗?
答案 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