2011-10-15 8 views
7

大きなデータセットをプロットする方法を尋ねるのではなく、たくさんのプロットを生成するコードが壊れないようにplotをラップしたい大きなオブジェクトをプロットする。 plotを非常に簡単な方法で包んでその機能をすべて保持するにはどうすればよいですか?最初に渡されるオブジェクトが大きすぎるかどうかをテストしますか?大きなデータセットをプロットするのを防ぐために、Rのプロット関数(またはggplot2)をラップする

このコードは、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:アイデアをテストする場合、私はテストすることをお勧めします> 1Mのサイズではなく、size> 100の場合(または変数を設定します(例:myThreshold <- 1000)、それ以外の場合は低速プロットに苦労します。 :)

答えて

6

問題は、現在コード化されているように、myplot()xがデータオブジェクトだと仮定していますが、それに数式を渡そうとしています。 Rのplot()は、メソッドを介してこれを実現します。xが式の場合、メソッドは基本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, ...) 
} 

あなたがオブジェクトにxを処理するために必要なコードで使用するplot.formula()からコードを盗むことができます。また、standard non-standard evaluation rules (PDF)に従って自分自身をロールすることもできます。

+0

+1正しい答えを投稿してください。 – Andrie

+0

+1何が起きているのか、そして標準的で非標準的な参照への非常に有用なポインタのための洞察。 'plot.formula'のコードをどこで見つけることができますか?私は、式からオブジェクトを抽出するコードはすべて動作すると思うので、それも探しています。 – Iterator

+1

@Iterator 'graphics ::: plot.formula'または' getAnywhere(plot.formula) 'がコードを表示します。 'methods(plot)'は、プロットジェネリックで利用可能なS3メソッドを示します。 'plot.formula'は' methods() 'の出力に' * 'で示されています。これは、関数自体が名前空間からエクスポートされていないことを示しています。代わりにS3のディスパッチ方法として登録されています。 –

関連する問題