編集:ハドリー・ウィッカムは、私が間違って話したと指摘しました。R CMDチェックは警告ではなくNOTESをスローします。混乱してすみません。それは私の見落としでした。
ショートバージョン
R CMD check
私がggplot2で賢明なプロット作成構文を使用するたびにこのメモを投げます:
no visible binding for global variable [variable name]
R CMDチェックがそれを行う理由を私は理解していますが、それは他の点では賢明な構文の全体の流れを犯罪化しているようです。私のパッケージが合格しR CMD check
、CRANに入院するための手順はわかりません。
背景
Sascha Epskampは以前に本質的に同じ問題について投稿しました。違いは、私が思うに、そのsubset()
マンページはインタラクティブな使用のために設計されていると言っていることです。
私の場合、問題は終わってsubset()
いませんがggplot2
、data =
引数のコア機能を超えています。
これらのメモを生成する私が書くコードの例
ここだサブ機能で、私のパッケージプロットにポイントを追加します。
JitteredResponsesByContrast <- function (data) {
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
R CMD check
、このコードを解析すると、
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
global variable 'y.values'
R CMDチェックが正しい理由
チェックは技術的に正しいです。x.values
そしてy.values
- 関数内でローカルに定義されていません
JitteredResponsesByContrast()
x.values <- [something]
グローバルに、または呼び出し元にフォームで事前定義されていません。
代わりに、それらは以前に定義されて関数に渡されるデータフレーム内の変数ですJitteredResponsesByContrast()
。
ggplot2がR CMDチェックの緩和を困難にする理由
ggplot2はdata
引数の使用を奨励しているようです。データ引数は、おそらく、このコードが実行される理由です
library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()
しかし、このコードはオブジェクトが見つからないというエラーを生成します:
library(ggplot2)
hwy # a variable in the mpg dataset
2つの回避策、およびどちらにも満足しない理由
NULLアウト戦略
Matthew Dowleは、問題のある変数を最初にNULLに設定することをお勧めします。私の場合は次のようになります。
JitteredResponsesByContrast <- function (data) {
x.values <- y.values <- NULL # Setting the variables to NULL first
return(
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
)
}
この解決策には感謝しますが、3つの理由でそれが嫌いです。
- 緩和する以外の目的はありません
R CMD check
。 - それは意図を反映していません。
aes()
実際の目的が不明瞭になる一方で、呼び出しはNULL変数(見えない)を参照するだろうという期待を高めます(R CMDチェックに、他の方法ではバインドされていることがわからないように見える変数を認識させます)。 - プロット要素を返す関数を作成するたびに、紛らわしいNULL化ステートメントを追加する必要があるため、1と2の問題が増大します。
with()戦略
を使用with()
して、問題の変数が一部のより大きな環境内で見つかることを明示的に通知できます。私の場合、使用with()
は次のようになります:
JitteredResponsesByContrast <- function (data) {
with(data, {
geom_point(
aes(
x = x.values,
y = y.values
),
data = data,
position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
)
}
)
}
このソリューションは機能します。しかし、私がこのソリューションを使用するのは、私が期待するように機能しないため、好きではありません。場合はwith()
、実際に変数がどこに通訳を指しているの問題を解決して、その後、私もべきではありません必要なdata =
引数を。しかし、with()
そのようには機能しません:
library(ggplot2)
p <- ggplot()
p <- p + with(mpg, geom_point(aes(x = hwy, y = cty)))
p # will generate an error saying `hwy` is not found
したがって、このソリューションにもNULL化戦略と同様の欠陥があると思います。
- 私はまだすべてのプロット要素関数を通過し、
with()
呼び出しでロジックをラップする必要があります with()
通話が誤解されています。私はまだdata =
議論を提供する必要があります。すべてwith()
がやっていることR CMD check
です。
結論
私の考えでは、3つの選択肢があります。
- CRANに「偽物」であると主張して(CRANポリシーに従って)ノートを無視するようロビーに働きかけ、パッケージを提出するたびにそれを行う
- 2つの望ましくない戦略(NULLまたは
with()
ブロック)の1つでコードを修正します。 - ハムは本当に大声で、問題がなくなることを願っています
この3つはどれも私を幸せにしません。私(およびggplot2を利用したい他のパッケージ開発者)が何をすべきかを人々が示唆しているのかと思います。よろしくお願いします。これを読んでいただいても結構です:-)
aes_string
transform
とsubset
、あまりにも(わからない100%が、それは理にかなっています)。