2016-03-04 5 views
5

ファンクションにパラメータを渡そうとするとエラーが発生します。類似コードは、例えば、geom_text)。ここでは例です:ggplot2:関数の引数をハードコードではなくパラメータとして渡そうとすると、stat_summaryがエラーをスローする

# Fake data 
set.seed(5) 
dat = data.frame(group=rep(c("A","B"),each=10), val=rnorm(20)) 

私たちは、パラメータを使用して、値ラベルの小数点以下の桁数を設定しようとするのではなく、それをハードコーディングします:evalの中

places = 2 

ggplot(dat, aes(group, val)) + 
    stat_summary(fun.y=mean, geom="text", aes(label=round(..y.., places))) 

エラー(exprの、envir、enclos):オブジェクト 'places'が見つかりません。

次の2つの例はうまくいきます。

ggplot(dat, aes(group, val)) + 
    stat_summary(fun.y=mean, geom="text", aes(label=round(..y.., 2))) 

ggplot(dat, aes(group, val)) + 
    geom_text(aes(label=round(val, places))) 

ggplot関数を記述しようとしているときに私はこの問題に遭遇しました。最初は私は問題が関数環境からパラメータを取得していないggplotと考えていましたが、上記の例ではそれが問題ではないことが示唆されています。完全性のために、関数の簡単な例とエラーメッセージを以下に示します。 placesパラメータを渡そうとするのではなく、数字の引数をroundにハードコードすると、この関数が正常に機能します。 evalの中

pp1 = function(data, group, var, places=2, e=1.5) { 

    ggplot(data, aes_string(group, var)) + 
    geom_boxplot() + 
    stat_summary(fun.y=mean, geom="text", aes(label=round(..y.., places))) + 
    scale_y_continuous(limits = e * range(data[,var])) 

} 

pp1(dat, "group","val") 

エラー(exprの、ENVIR、enclos):オブジェクトの場所は「私は私が何か間違ったことをやっているかどうかを確認するために願っています

を見つけていないとどのように私ができます所望の挙動を得る。

私はR 3.2.3とggplot2 2.1.0をOS X 10.10.5上で実行しています。

+1

NSEの問題のようです。あなたは 'eval(substitute(... ggplot code ...、list(places = places)))')を呼び出すことでそれを避けることができますが、よりよい方法があるかもしれません。 – alistaire

+1

それは動作します。それを回答として追加してください。'stat_summary'の中でなぜそれが起こっているのか知っていますか? – eipi10

+0

わかりません。これは、エースのNSEがどのように機能するかについてのものです。多分、それは '..y..'によってスイッチオンされるでしょうか? 'aes_'というSEバージョンがありますが、' ..y..'引数をどのように取得するのかは分かりません。私は上記と何か他の何かを答えを投稿します。 – alistaire

答えて

2

aesnon-standard evaluationを使用するので、data引数の中でplacesを評価しようとします。しかし、そのNSEはあなたが渡すものによって異なります。

NSEをバイパスする典型的な方法は、substituteです。これはコード内の値で置き換えられます。聞かせてもよく、aes_aes_q、およびaes_string

eval(substitute(ggplot(dat, aes(group, val)) + 
        stat_summary(fun.y=mean, geom="text", aes(label=round(..y.., places))), 
       list(places = places))) 

期待通りに動作します:

plot with labels

ハドレーもaesのいくつかのSEのバージョンを提供していますが、コードを実行するためにevalを使用することができますあなたはsubstituteの使用を避けますが、私は..y..を評価することができませんでした。 (もし誰でもそれを構成する方法が分かっていれば、私は更新します)

ハドレーもlazyeval packageを作成しました。これはNSEの管理に役立ちます。

関連する問題