4

そのため、いくつかの R 関数をパッケージに入れることにし、 R Extensionの記述を読んだり学んだりしています。

それは明らかに、私が正しくしていない多くのことについて不平を言っています。

これはテスト スタイルに関するものです。RUnitを使用しており、テスト対象のコードにできるだけ近いテストを行うのが好きです。こうすることで、テストのことを忘れずに、テストを技術文書の一部として使用しています。

例えば:

fillInTheBlanks <- function(S) {
  ## NA in S are replaced with observed values

  ## accepts a vector possibly holding NA values and returns a vector
  ## where all observed values are carried forward and the first is
  ## carried backward.  cfr na.locf from zoo library.
  L <- !is.na(S)
  c(S[L][1], S[L])[1 + cumsum(L)]
}

test.fillInTheBlanks <- function() {
  checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4))
  checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4))
  checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4))
}

しかしR CMD check、次のような NOTE 行を発行します。

test.fillInTheBlanks: no visible global function definition for
  ‘checkEquals’

そして、私がテスト関数を文書化していないと文句を言います。

私は実際にはテスト関数のドキュメントを追加したくありません。RUnit パッケージに依存関係を追加する必要がないことを絶対に望んでいます。

この問題をどう見るべきだと思いますか?

4

2 に答える 2

4

単体テストをどこに置いていますか?Rそれらをディレクトリに入れたくない場合があります。より標準的なアプローチは、それらを の下に置くことinst\unitTestsです。構成については、この R-wiki ページを参照してください

または、NAMESPACE でエクスポートするファイルを指定し、拡張子によって、ドキュメント化する必要がある機能とドキュメント化しない機能を指定できます。

それを超えて、理想的には、R CMD CHECK が呼び出されたときにテストを実行する必要があります。それはデザインの一部です。testsその場合、別のディレクトリでテストを呼び出すテスト スクリプトを作成する必要があります。そして、そのスクリプトで RUnit パッケージをロードする必要があります (ただし、パッケージの依存関係にする必要はありません)。

編集1:

checkEquals 関数が見つからないために失敗した場合: 関数を次のように変更します。

test.fillInTheBlanks <- function() {
  require(RUnit)
  checkEquals(fillInTheBlanks(c(1, NA, NA, 2, 3, NA, 4)), c(1, 1, 1, 2, 3, 3, 4))
  checkEquals(fillInTheBlanks(c(1, 2, 3, 4)), c(1, 2, 3, 4))
  checkEquals(fillInTheBlanks(c(NA, NA, 2, 3, NA, 4)), c(2, 2, 2, 3, 3, 4))
}

このようにして、関数が呼び出されたときにパッケージがロードされるか、パッケージが必要であることをユーザーに通知します。

編集2:

「R拡張機能の作成」から:

パッケージ内のすべてのユーザー レベル オブジェクトを文書化する必要があることに注意してください。パッケージ pkg に「内部」使用のみのユーザーレベルのオブジェクトが含まれている場合、そのようなすべてのオブジェクトを文書化するファイル pkg-internal.Rd を提供し、これらがユーザーによって呼び出されることを意図していないことを明確に示す必要があります。例として、R ディストリビューションのパッケージ グリッドのソースを参照してください。内部オブジェクトを広範囲に使用するパッケージは、文書化する必要がない場合、それらのオブジェクトを名前空間に隠す必要があることに注意してください (パッケージの名前空間を参照してください)。

オプションの 1 つとして pkg-internal.Rd ファイルを使用できますが、多くの非表示オブジェクトを使用する場合、これは通常、NAMESPACE の宣言で処理されます。

于 2009-12-10T12:32:39.690 に答える
1

RUnitパッケージをロードしましたか?

あなたの最善の策は、おそらく を使用して既存のコードを含むパッケージを調べることRUnitです。

于 2009-12-10T12:23:10.657 に答える