自分のパッケージ内で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
なぜこれが起こっているのか、そして私がそれを修正するために何ができるのかを誰かに説明できますか?どんな助けでも大歓迎です。
アンドリーの推測は正しい、+ 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での変更点
*すべてのパッケージには名前空間が必要です。ソースに提供されていない場合は、インストール時に名前空間が作成されます。
これが完全なレシピです:
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
を受け取るべきではありません