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: アイデアをテストするときは、myThreshold <- 10001M を超えるサイズではなく、サイズが 100 を超える (または変数を設定する) ことをお勧めします。:)

4

1 に答える 1

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()への処理に必要なコードで使用できます。または、標準の非標準評価ルール (PDF) に従ってx独自に作成することもできます。

于 2011-10-15T18:05:57.013 に答える