7

与其问如何绘制大数据集,我想进行包装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:在测试想法时,我建议测试大小 > 100(或设置变量,例如myThreshold <- 1000),而不是与 > 1M 的大小相比 - 否则在缓慢绘图时会有很多痛苦。:)

4

1 回答 1

6

您遇到的问题是,按照当前的编码,myplot()假设x是一个数据对象,但是您尝试向它传递一个公式。R'splot()通过方法实现这一点 - 当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成对象所需的代码。或者,您可以按照标准非标准评估规则 (PDF)自行滚动。

于 2011-10-15T18:05:57.013 回答