84

自分のパッケージ内で data.table パッケージを使用しようとしています。MWE は次のとおりです。

関数 test.fun を作成します。この関数は、単純に小さな data.table オブジェクトを作成し、「A」列でグループ化された「Val」列を合計します。コードは

test.fun<-function ()
{
    library(data.table)
    testdata<-data.table(A=rep(seq(1,5), 5), Val=rnorm(25))
    setkey(testdata, A)
    res<-testdata[,{list(Ct=length(Val),Total=sum(Val),Avg=mean(Val))},"A"]
    return(res)
}

この関数を通常の R セッションで作成して実行すると、期待どおりに機能します。

> res<-test.fun()
data.table 1.8.0  For help type: help("data.table")
> res
     A Ct      Total        Avg
[1,] 1  5 -0.5326444 -0.1065289
[2,] 2  5 -4.0832062 -0.8166412
[3,] 3  5  0.9458251  0.1891650
[4,] 4  5  2.0474791  0.4094958
[5,] 5  5  2.3609443  0.4721889

この関数をパッケージに入れ、パッケージをインストールし、パッケージをロードして関数を実行すると、エラー メッセージが表示されます。

> library(testpackage)
> res<-test.fun()
data.table 1.8.0  For help type: help("data.table")
Error in `[.data.frame`(x, i, j) : object 'Val' not found

なぜこれが起こっているのか、そしてそれを修正するために何ができるのかを誰か説明してもらえますか. どんな助けでも大歓迎です。

4

2 に答える 2

96

Andrie の推測は正しい、+1 です。それに関する FAQ ( を参照) と、インポートに関するvignette("datatable-faq")新しいビネットdata.tableがあります。

FAQ 6.9: data.table に依存するパッケージを作成しました。data.frame からの継承が機能するように、パッケージが data.table-aware であることを確認するにはどうすればよいですか?

i) DESCRIPTION ファイルdata.tableDepends:フィールドに含めるか、ii) DESCRIPTION ファイルdata.tableImports:フィールドとimport(data.table)NAMESPACE ファイルに含める。

さらなる背景... [.data.table(および他のdata.table関数)の上部に、への呼び出しの結果に応じてスイッチが表示されcedta()ます。これは Calling Environment Data Table Aware の略です。タイプdata.table:::cedtaすると、それがどのように行われたかが明らかになります。名前空間を持つ呼び出し元のパッケージに依存しており、その名前空間が Import'ing または Depend'ing ondata.tableです。これはdata.tabledata.table を認識しないパッケージ ( の関数など) に渡す方法であり、それらのパッケージは、 aをまったく意識せずに、base完全に標準的な[.data.frame構文を使用できます。data.tabledata.frame is()data.table

これは、data.table継承が名前空間のないパッケージと互換性がなかった理由でもあり、ユーザーの要求に応じて、そのようなパッケージの作成者に互換性を持たせるためにパッケージに名前空間を追加するよう依頼しなければならなかった理由でもあります。幸いなことに、R が (v2.14.0 から) 欠落しているパッケージのデフォルトの名前空間を追加したので、その問題はなくなりました:

R バージョン 2.14.0 での変更
* すべてのパッケージには名前空間が必要であり、ソースで指定されていない場合は、インストール時に名前空間が作成されます。

于 2012-05-10T08:08:33.793 に答える
37

完全なレシピは次のとおりです。

  1. ファイルに追加data.tableImportsますDESCRIPTION

  2. @import data.tableそれぞれの .R ファイル (つまり、エラーをスローしている関数を格納する .R ファイル) に追加しますError in [.data.frame(x, i, j) : object 'Val' not found

  3. 作業ディレクトリを入力library(devtools)して、R パッケージのメイン ディレクトリを指すように設定します。

  4. タイプしdocument()ます。NAMESPACEこれにより、ファイルに行が含まれることが保証されますimport(data.table)

  5. タイプbuild()

  6. タイプinstall()

build()何をして何をするかについての優れた入門書については、http: //kbroman.org/pkg_primer/install()を参照してください。

次に、R セッションを閉じて次回ログインすると、すぐに次のようにジャンプできます。

  1. タイプlibrary("my_R_package")

  2. 上記の .R ファイルに格納されている関数の名前を入力します。

  3. 楽しみ!あなたはもはや恐ろしいものを受け取るべきではありませんError in [.data.frame(x, i, j) : object 'Val' not found

于 2016-04-29T05:59:38.660 に答える