1. ホーム
  2. r

[解決済み] 自分のパッケージの中でdata.tableパッケージを使用する

2023-06-17 10:58:58

質問

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

私は、単に小さなdata.tableオブジェクトを作成し、次に"A"列によってグループ化された"Val"列を合計する関数、test.funを作成します。 コードは次のとおりです。

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

なぜこのようなことが起こるのか、またそれを解決するために何ができるのか、どなたか説明していただけませんか。 どんな助けでも非常に感謝します。

どのように解決するのですか?

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

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

どちらか i) インクルード data.table の中に Depends: フィールドに記述するか、または ii) DESCRIPTION ファイルの data.table を含める。 Imports: フィールドと import(data.table) というフィールドがあります。

さらなる背景...............の一番上にある [.data.table (そして他の data.table 関数) を呼び出すと、その結果に応じてスイッチが表示されます。 cedta() . これは Calling Environment Data Table Aware の略である。タイピング data.table:::cedta をタイプすると、それがどのように行われるかがわかります。呼び出し側のパッケージが名前空間を持ち、その名前空間がImport'or Depend'on data.table . これは data.table に渡すことができます。 data.table-awareに渡すことができます。 パッケージ(例えば base の関数など) があり、それらのパッケージは絶対的に標準的な [.data.frame の構文を使うことができます。 data.table を実装していることに気づかないまま data.frame is() a data.table も、あります。

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

R バージョン 2.14.0 での変更点

* すべてのパッケージは名前空間を持つ必要があり、ソースで提供されていない場合、インストール時に作成されます。