web-dev-qa-db-ja.com

自分のパッケージ内でdata.tableパッケージを使用する

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

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

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

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

75
ruser

アンドリーの推測は正しい、+ 1。 FAQ)があり(vignette("datatable-faq")を参照)、_data.table_のインポート時に新しい vignette があります。

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

I)DESCRIPTIONファイルの_data.table_フィールドに_Depends:_を含めるか、ii)DESCRIPTIONファイルの_data.table_フィールドに_Imports:_を含めるか、import(data.table) NAMESPACEファイル内。

さらに背景... _[.data.table_(およびその他の_data.table_関数)の上部に、cedta()の呼び出し結果に応じてスイッチが表示されます。これは、Calling Environment Data Table Awareの略です。 _data.table:::cedta_と入力すると、その方法が表示されます。それは名前空間を持つ呼び出し側のパッケージと、その名前空間が_data.table_にインポートまたは依存していることに依存しています。これが_data.table_を非data.table-awareパッケージ(baseの関数など)に渡す方法ですこれらのパッケージは、_[.data.frame_で絶対に標準の_data.table_構文を使用できます。_data.frame_ is()が_data.table_であることにも気付かないでしょう。

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

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

86
Matt Dowle

これが完全なレシピです:

1)ImportsファイルのDESCRIPTIONに_data.table_を追加します。

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

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

4)document()と入力します。これにより、NAMESPACEファイルにimport(data.table)行が含まれるようになります。

5)タイプbuild()

6)タイプinstall()

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

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

1)タイプlibrary("my_R_package")

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

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

23
warship