我不想询问如何绘制大数据集,而是要包装plot
,以便生成大量图形的代码在绘制大型对象时不会受到重创。如何以非常简单的方式包装plot
以保持其所有功能,但首先测试以确定传递的对象是否太大?
此代码适用于对plot
的非常普通的调用,但它与plot
缺少相同的通用性(见下文)。
myPlot <- function(x, ...){
isBad <- any( (length(x) > 10^6) || (object.size(x) > 8*10^6) || (nrow(x) > 10^6) )
if(is.na(isBad)){isBad = FALSE}
if(isBad){
stop("No plots for you!")
}
return(plot(x, ...))
}
x = rnorm(1000)
x = rnorm(10^6 + 1)
myPlot(x)
失败的例子:
x = rnorm(1000)
y = rnorm(1000)
plot(y ~ x)
myPlot(y ~ x)
是否有一些简单的方法来包装plot
以启用对要绘制的数据的检查,同时仍然传递所有参数?如果没有,那么ggplot2
怎么样?我是一个平等的机会非绘图员。 (在数据集很大的情况下,我将使用hexbin,子采样,密度图等,但这不是重点。)
注1:在测试创意时,我建议测试尺寸&gt; 100(或设置变量,例如myThreshold <- 1000
),而不是大小>&gt; 1M - 否则在缓慢绘图方面会有很多痛苦。 :)
答案 0 :(得分:6)
您遇到的问题是,按照当前编码,myplot()
假设x
是一个数据对象,但您尝试将其传递给公式。 R plot()
通过方法实现了这一点 - 当x
是公式时,会调度plot.formula()
方法而非基本plot.default()
方法。
您需要这样做:
myplot <- function(x, ...)
UseMethod("myplot")
myplot.default <- function(x, ....) {
isBad <- any((length(x) > 10^6) || (object.size(x) > 8*10^6) ||
(nrow(x) > 10^6))
if(is.na(isBad)){isBad = FALSE}
if(isBad){
stop("No plots for you!")
}
invisible(plot(x, ...))
}
myplot.formula <- function(x, ...) {
## code here to process the formula into a data object for plotting
....
myplot.default(processed_x, ...)
}
您可以窃取plot.formula()
中的代码,以便在将x
处理成对象所需的代码中使用。或者,您可以按照standard non-standard evaluation rules (PDF)。