ggplot2構文が適切である場合、R CMDチェックの「グローバル変数にバインドが表示されない」という注記をどのように処理できますか?


180

編集:ハドリー・ウィッカムは、私が間違って話したと指摘しました。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()いませんがggplot2data =引数のコア機能を超えています。

これらのメモを生成する私が書くコードの例

ここだサブ機能、私のパッケージプロットにポイントを追加します。

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つの理由でそれが嫌いです。

  1. 緩和する以外の目的はありませんR CMD check
  2. それは意図を反映していません。aes()実際の目的が不明瞭になる一方で、呼び出しはNULL変数(見えない)を参照するだろうという期待を高めます(R CMDチェックに、他の方法ではバインドされていることがわからないように見える変数を認識させます)。
  3. プロット要素を返す関数を作成するたびに、紛らわしい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化戦略と同様の欠陥があると思います。

  1. 私はまだすべてのプロット要素関数を通過し、with()呼び出しでロジックをラップする必要があります
  2. with()通話が誤解されています。私はまだdata =議論を提供する必要があります。すべてwith()がやっていることR CMD checkです。

結論

私の考えでは、3つの選択肢があります。

  1. CRANに「偽物」であると主張して(CRANポリシーに従って)ノートを無視するようロビーに働きかけ、パッケージを提出するたびにそれを行う
  2. 2つの望ましくない戦略(NULLまたはwith()ブロック)の1つでコードを修正します。
  3. ハムは本当に大声で、問題がなくなることを願っています

この3つはどれも私を幸せにしません。私(およびggplot2を利用したい他のパッケージ開発者)が何をすべきかを人々が示唆しているのかと思います。よろしくお願いします。これを読んでいただいても結構です:-)


20
#1と#3が好きです。
ベンボルカー、2012

8
@BenBolkerそれらも私の得意技です。
ハドリー

6
4番目のオプションがあります。「R CMDチェック」を変更し、検討のためにパッチをr-develに送信します。どれが偽物で、どれが偽物ではないかを検出することは非常に難しい(そしておそらく不可能)であることがわかるでしょう。誰かがそれを行うためのコードを思いついたら、それから...
Matt Dowle

6
別の戦略は、使用することですaes_string
13:18にハドリー

2
これは、に問題があるようだtransformsubset、あまりにも(わからない100%が、それは理にかなっています)。
BrodieG 2014

回答:


45

aes_string代わりに試してみましたaesか?私はそれを試していませんが、これはうまくいくはずです:

aes_string(x = 'x.values', y = 'y.values')

4
ただの警告ですaesが、aes_string位置パラメータxとを定義しませんy
topchef 2013年

6
ちょうど別の警告。aes_stringでは、x値とy値を操作する関数を使用できません。ログ変換yを記録するとします。この場合、もちろんaes_string(x = 'x.values'、y = 'log(y.values)')は機能しません。私は自分でこの種の変換を頻繁に使用するため、aes_stringが常に選択肢になるとは限りません。
マイク博士、

おそらく、この回答(および最も投票数の多い回答)は、aes_string「これらの関数はすべてソフトで非推奨になっています。代わりに整頓された評価イディオムを使用してください(aes()文書の準引用セクションを参照)」ので、更新する必要があります。(ggplot2バージョン3.2.1)。それはおそらくrlang::.dataこれらのノートを沈黙させるための最良の候補になります。
Vandenman

86

あなたには2つの解決策があります:

  • 非標準の評価を避けるためにコードを書き直してください。ggplot2の場合、これは(Harlanが説明した)のaes_string()代わりに使用することを意味しますaes()

  • globalVariables(c("x.values", "y.values"))パッケージのトップレベルのどこかに呼び出しを追加します。

CRANに送信するときは、少しハックしなければならない場合でも、パッケージ内の0 NOTESに注意する必要があります。これにより、CRANの生活が楽になり、あなたにとっても楽になります。

(これに関する私の最新の考えを反映するために2014-12-31を更新しました)


26
globalVariables恐ろしいハックであり、私はそれを決して使用しません。
ハドリー2012

10
価値があるのは、これらのメモのために私のパッケージの提出が拒否され、utils :: globalVariables関数を使用するように言われたことです。私は議論する立場にないので、それは私がやったことです。
jbryer 2013

9
私はそれがそれらを無視するのがベストだろうと同意するが、私のコードが使用するロットのggplotdata.table、ひいては持っトン本当に私は修正するために必要な問題だった他の多くの重要な警告に気付いてから私を保持しているこれらの警告のを、。
ケンウィリアムズ

108
@hadley 2年後には大丈夫だと思ったときに、決して使用しないと言ってはいけません
hadley

10
新年の抱負?目を開いたままにし、ggplot::scale_dualAxis.sqrt塗りつぶしパターン付きの3D円グラフを表示します。
バプティスト2014

29

この質問は少し前に尋ねられ、回答されましたが、参考までに、バージョン2.1.0以降、メモを回避する別の方法があります。aes_(x=~x.values,y=~y.values).


12

もし

getRversion() >= "3.1.0"

パッケージの最上位にコールを追加できます。

utils::suppressForeignCheck(c("x.values", "y.values"))

から:

help("suppressForeignCheck")

3
それは公正な解決策です。ありがとう!私はこれを検討しましたが、問題は、x.valuesおよびのような非常に多くの変数があるy.valuesため、それらのすべてを登録する必要があることです。
briandk

4
それはsuppressForeignCheck使用されているものではありません
ハドリー

10
実際にはトップレベルはどこですか?どのファイルにこのコマンドを追加しますか?
drmariod

9
カスタムでは、これはのzzz.Rファイルに配置されます./R/。たとえば、github.com / HughParsonage / grattan / blob / master / R / zzz.R
Hugh

6
@ハドリー、それは何のために使われるのですか?help( "suppressForeignCheck")は、「実行時に計算されたネイティブシンボル」用であることを暗示しているようですが、一体何ですか?
pdb 2017

8

2019年、これを回避する最良の方法は.datarlangパッケージのプレフィックスを使用することです。これは、治療のためにRを告げるx.valuesy.valuesの列としてdata.frame(それは未定義の変数文句はありませんので)。

注:これは、データ入力に存在することがわかっている定義済みの列名がある場合に最適に機能します

#' @importFrom rlang .data
my_func <- function(data) {
    ggplot(data, aes(x = .data$x, y = .data$y))
}

3

次のコード行を、パッケージレベルのドキュメントを提供するファイルに追加します。

if(getRversion() >= "2.15.1")  utils::globalVariables(c("."))

ここの

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.