web-dev-qa-db-ja.com

グローバル変数の表示可能なバインディングはありませんRCMDチェックの注

パッケージをチェックしたところ、リスト要素の逐語的な名前を引数として使用するsubsetのような関数を使用すると、「グローバル変数の表示可能なバインディングがない」というメモが表示されることに気付きました。

たとえば、データフレームの場合:

foo <-data.frame(a = c(TRUE、FALSE、TRUE)、b = 1:3)

私は次のようなばかげたことをすることができます:

subset(foo,a)
transform(foo,a=b)

期待どおりに機能します。ただし、R CMDのRコードチェックは、これらが要素を参照していることを理解しておらず、グローバル変数の目に見えるバインディングがないことについて不平を言っています。

これは問題なく機能しますが、パッケージにメモを入れるのはあまり好きではなく、エラー、警告、メモがまったくない状態でチェックに合格することを好みます。また、コードをあまり作り直したくありません。引数がグローバル変数を参照していないことが明確になるように、これらのコードを記述する方法はありますか?

42
Sacha Epskamp

_R CMD check_を通過するには、次のいずれかを実行できます。

  • get("b")を使用します(ただし、それは面倒です)
  • _a=b=NULL_を関数の上のどこかに配置します(これが私が行うことです)

しばらく前にr-develにスレッドがあり、r-coreの誰かが基本的に(メモリから)「NOTESは大丈夫です。作者がそれをチェックしてNOTEで大丈夫だと想定しています。」と言っていました。しかし、私はあなたに同意します。私は、すべてのプラットフォームでCRANチェックがクリーンな「OK」を返すようにすることを好みます。そうすれば、ユーザーは間違いなくチェックに合格することになります。

編集:

これが r-devel thread 私が覚えていた(2010年4月から)。したがって、これは、NOTEを回避する既知の方法がない状況があることを示唆しているように見えますが、それは問題ありません。

44
Matt Dowle

これは、subsetを非対話的に使用した場合の潜在的な「予期しない結果」の1つです。 ?subsetの警告セクションにあるように:

これは、インタラクティブに使用することを目的とした便利な関数です。プログラミングには、「[」などの標準のサブセット関数を使用することをお勧めします。特に、引数「サブセット」の非標準の評価は、予期しない結果をもたらす可能性があります。

17
Joshua Ulrich

Rバージョン2.15.1以降、これを回避する方法があります。

if(getRversion() >= "2.15.1")  utils::globalVariables(c("a", "othervar"))
11
seancarmody

_?subset_の警告セクションにあるように、サブセットをインタラクティブに使用し、プログラミングには_[_を使用することをお勧めします。

次のようなコマンドを置き換えます

subset(foo,a)

_foo[foo$a]_

またはfooがデータフレームの場合:

_foo[foo$a, ]_

fooがデータフレームであり、評価される式が複雑な場合は、withを使用することもできます。

with(foo, foo[a, ])

9
tekumara

この問題が発生し、ggplot2セクションまで追跡しました。

このコードはエラーを提供しました:

ggplot2::ggplot(data = spec.df, ggplot2::aes(E.avg, fraction)) +
  ggplot2::geom_line() +
    ggplot2::ggtitle(paste0(title))

パラメータにデータ名を追加すると、次のことはなくなりました。

ggplot2::ggplot(data = spec.df, ggplot2::aes(spec.df$E.avg, spec.df$fraction)) +
  ggplot2::geom_line() +
    ggplot2::ggtitle(paste0(title))

2
markhogue