2011-09-18 13 views
10

私は例えば、関数内でqplotのbinwidth警告を抑制する方法は?

> library(ggplot2) 
> d=rnorm(100) 
> myfun=function(x) qplot(x) 

はそれが警告与え実行すると、ヒストグラムを描画するためにqplot()を使用する関数を書いています:警告を抑止するには

> myfun(d) 
stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this. 

を、私は、ビン幅を自分で計算してみましたこれは、エラーを与え、プロットされていません。

> myfun=function(x) print(qplot(x, binwidth=diff(range(x))/30)) 
> myfun(d) 
Error in diff(range(x)) : object 'x' not found 

私は2つの関連質問がある:

  • ここでは何が起こっていますか?オブジェクト 'x'が見つからないのはなぜですか?
  • 警告が生成されないように関数を記述する方法はありますか?

ありがとう!

+0

'myfun(as.data.frame(d))'を実行すると 'qplot(d、data = x、binwidth = diff(range(d))/ 30)'になります。したがって、 'binwidth'引数は指定されたデータフレームのコンテキストで厳密に評価されるように見えます。それが機能かバグかどうかはわかりません。 –

+0

質問は、関数内のメッセージをどのように抑止するかではなく、どのように抑止するかです。例えば、 'suppressMessages(qplot(rnorm(10)))'は依然としてメッセージを与えます。 – kmm

+0

@ダニエル - 問題はプラットフォームやバージョンに依存しているようです。あなたのソリューションはR 2.12.1とggplot2 0.8.9を使ってMac上で動作しますが、WindowsではR 2.13.0とggplot2 0.8.9では動作しません。残念ながら、Windowsは私のターゲットプラットフォームです。 –

答えて

8

私はこの1つのなぜを説明(ハドレーはによってスイングし、そうすることができる)が、ggplotの代わりqplot問題を解決して使用していないことができます。

d <- data.frame(v1 = rnorm(100)) 
myfun <- function(x){ 
    p <- ggplot(data = x, aes(x = v1)) + 
        geom_histogram(binwidth = diff(range(x$v1))/30) 
    print(p) 
} 

このようにすると警告メッセージが表示されません。また、ggplotを使用し、geom_histogrambinwidth = ...部分を削除すると警告が再表示されますが、suppressMessagesも同様に機能します。

私はこれが名前空間や環境に関係していると思われます。いつでも/どこでqplotggplotが引数を評価していると思われます。しかし、再び、それはいくつかの混乱を解消しようとするには...

+2

遅延評価... – hadley

+0

@joranありがとう、ありがとう! –

1

テレビではこう言っています。「これは実際の警告であったかどうかは、あなたの地方自治体の指示があったはずです。

警告ではないので、私の元の回答でエラーが発生していませんでした。これは私が書いたはずのものです:

options(warnings= -1) 
<do something> # no warnings 
options(warnngs=1) 
<business as usual> 

しかし、それは警告ではなくコンソールへのメッセージでした。ここではそれを停止する方法は次のとおりです。

con=file("temp.fil", "w") 
sink(con, type="message") 
library(ggplot2) 
    d=rnorm(100) 
    myfun=function(x) qplot(x) 
    myfun(d) 
sink(type="message") 
+0

これはbinwidthの警告を抑制しません。 –

+0

警告ではありません。プロット関数が送信しているというメッセージです。もしあなたがそれを吸うようにしたら、 'sink'か' capture.output'を使う必要があります。 –

+3

suppressMessagesを使用する – hadley

8

ただの推測ですが、この構築物が表示されるようにビン幅の警告/メッセージを防ぐことはできません。

suppressMessages(p <- ggplot(...)) 
print(p) 

しかし、これは行います

p <- ggplot(...) 
suppressMessages(print(p)) 

ハドリーのコメントが指摘するように、遅延評価は、stat_*機能が実際には印刷時に実行されるまで実行されないようにします。

+2

gridExtraを使用している場合、grid.draw呼び出しではなくarrangeGrob呼び出しで評価が行われます。したがって、suppressMessages(arrangeGrob(...))が必要です。私はこれを考え出して時間を無駄にした。 – lionel

関連する問題