32

devtools、testthat、および roxygen2 を使用して、R パッケージの開発に取り組んでいます。データ フォルダー (foo.txt と bar.csv) にいくつかのデータ セットがあります。

私のファイル構造は次のようになります。

/ mypackage
    / data
        * foo.txt, bar.csv
    / inst
        / tests
            * run-all.R, test_1.R
    / man
    / R

「foo」と「bar」が正しく文書化されていると確信しています:

    #' Foo data
    #'
    #' Sample foo data
    #'
    #' @name foo
    #' @docType data
    NULL
    #' Bar data
    #'
    #' Sample bar data
    #'
    #' @name bar
    #' @docType data
    NULL

ドキュメントの例と単体テストで「foo」と「bar」のデータを使用したいと思います。

たとえば、次を呼び出してテストするテストでこれらのデータセットを使用したいと思います。

    data(foo)
    data(bar)
    expect_that(foo$col[1], equals(bar$col[1]))

そして、ドキュメントの例を次のようにしたいと思います。

    #' @examples
    #' data(foo)
    #' functionThatUsesFoo(foo)

パッケージの開発中に data(foo) を呼び出そうとすると、「data set 'foo' not found」というエラーが発生します。ただし、パッケージをビルドしてインストールし、ロードすると、テストとサンプルを機能させることができます。

私の現在の回避策は、例を実行しないことです。

    #' @examples
    #' \dontrun{data(foo)}
    #' \dontrun{functionThatUsesFoo(foo)}

テストでは、ローカル コンピューターに固有のパスを使用してデータを事前に読み込みます。

    foo <- read.delim(pathToFoo, sep="\t", fill = TRUE, comment.char="#")
    bar <- read.delim(pathToBar, sep=";", fill = TRUE, comment.char="#"
    expect_that(foo$col[1], equals(bar$col[1]))

これは理想的とは思えません。特に私は他のユーザーと共同作業を行っているため、すべての共同作業者が 'foo' と 'bar' への同じフル パスを持っている必要があります。さらに、ドキュメントの例は実行できないように見えますが、パッケージをインストールすると実行できます。

助言がありますか?どうもありがとう。

4

2 に答える 2

21

例/テスト内の非RDataファイルのインポート

JSONIOパッケージをピアリングすることで、この問題の解決策を見つけました。これは、.RDataの種類以外のファイルを読み取る例をいくつか提供する必要があることは明らかです。

これを関数レベルの例で機能させ、とR CMD check mypackage同様に両方を満たしtestthat::test_package()ます。

(1)サンプルデータディレクトリが内にあるように、パッケージ構造を再編成しますinst。ある時点で、 R CMD check mypackageRData以外のデータファイルをに移動するように指示されたinst/extdataため、この新しい構造では、名前も変更されています。

/ mypackage
    / inst
        / tests
            * run-all.R, test_1.R
        / extdata
            * foo.txt, bar.csv
    / man
    / R
    / tests
        * run-testthat-mypackage.R

(2)(オプション)最上位testsディレクトリを追加して、テストがの間にも実行されるようにしR CMD check mypackageます。

run-testthat-mypackage.Rスクリプトには、少なくとも次の2行が必要です。

library("testthat")
test_package("mypackage")

これは、testthatを中に呼び出すことができる部分であり、R CMD check mypackageそれ以外の場合は必要ないことに注意してください。testthatまた、DESCRIPTIONファイルにも「Suggests:」依存関係を追加する必要があります。

(3)最後に、パッケージ内パスを指定するための秘密のソース:

barfile <- system.file("extdata", "bar.csv", package="mypackage")
bar <- read.csv(barfile)
# remainder of example/test code here...

コマンドの出力を見るとsystem.file()、Rフレームワーク内のパッケージへの完全なシステムパスが返されています。Mac OS Xでは、これは次のようになります。

"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/mypackage/extdata/bar.csv"

これが私にとって問題ないと思われる理由は、パッケージ内のもの以外のパス機能をハードコーディングしないためです。したがって、このアプローチは、他のシステム上の他のRインストールに対して堅牢である必要があります。

data()アプローチ

セマンティクスに関しては、data()私が知る限り、これは.RData最上位dataディレクトリのRバイナリ()ファイルに固有のものです。したがって、データファイルを事前にインポートし、save()コマンドを使用してデータディレクトリに保存することで、上記の例を回避できます。ただし、これは、ファイルをインポートするアップストリームプロセスを再現可能に示すのではなく、データがすでにRにロードされている例のみを示す必要があることを前提としています。

于 2012-06-21T22:29:38.727 に答える
2

@hadley のコメントによると、.RData変換はうまくいきます。

チーム メンバー間のさまざまな環境でのチーム コラボレーションのより広範な問題に関しては、一般的なパターンは、単一の環境変数 (たとえば、FOO_PROJECT_ROOTチームの全員がそれぞれの環境で適切に設定する) に同意することです。その時点から、プロジェクト間を含め、相対パスを使用できます。

.RprofileR 固有のアプローチは、すべてのチーム メンバーがファイルに設定するいくつかのデータ/関数に同意することです。これは、たとえば、devtoolsが非標準の場所にあるパッケージを検索する方法です。

最後に、最適ではありませんが、開発者固有のコードを実際にリポジトリに配置できます。@hadleyがそれを行う場合、それはそれほど悪いことではありません. たとえば、彼が自分の環境で特定の行動をどのように活性化するかを見てください。testthat

于 2012-06-20T03:25:22.793 に答える