1. ホーム
  2. r

[解決済み】私のggplot2構文が賢明であるときに、R CMDチェック「no visible binding for global variable」注記を処理するにはどうすればよいですか?

2022-04-12 15:23:11

質問

EDIT: Hadley Wickhamの指摘により、私が間違ったことを言いました。R CMDチェックはWarningではなく、NOTESを投げています。混乱させてしまい、大変申し訳ありません。私の見落としでした。

ショートバージョン

R CMD check を使用するたびにこのメモを投げます。 賢明なプロット作成構文 ggplot2 で。

no visible binding for global variable [variable name]

R CMD チェックがなぜそうなるかは理解できますが、そうでなければ賢明な構文の脈絡全体を犯罪にしているように思えます。私のパッケージがこのチェックにパスするために、どのような手順を踏めばよいのかわかりません。 R CMD check で、CRANに登録されるようになりました。

背景

Sascha Epskampは以前、次のような記事を投稿しています。 本質的に同じ問題 . 違いは、私が思うに subset() 'sのマンページ インタラクティブに使用するように設計されています。 .

私の場合、問題は終わっていません 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.valuesy.values

  • 関数内でローカルに定義されていない JitteredResponsesByContrast()
  • フォームにあらかじめ定義されていないこと x.values <- [something] グローバルに、あるいは呼び出し元で。

その代わり、先に定義されたデータフレーム内の変数として、関数に渡されます。 JitteredResponsesByContrast() .

ggplot2がRのCMDチェックに難色を示す理由

ggplot2 は、"globus" という名前のついた data 引数を使用します。引数dataは、おそらく、このコードが実行される理由です。

library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()

しかし これ のコードは、object-not-found エラーを発生させます。

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つの望ましくない戦略のうちの1つ(NULL化または with() ブロック)
  3. 大きな声でハミングして、問題が解決することを祈る。

この3つのどれもが私を満足させません。私は、人々が私に(そしてggplot2を利用したいと思っている他のパッケージ開発者に)何を提案するのか疑問に思っています。

どのように解決しますか?

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

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