33

私が開発している R パッケージには、事前に計算されたモデルやパラメーターなど、いくつかの R データ オブジェクトが必要です。

現在、個々の .RData ファイルのパッケージの「データ」ディレクトリに各オブジェクトがあります。パッケージを使用する場合、ユーザーは「データ」機能を使用して、これらのオブジェクトを環境にアタッチできます。

代わりに、パッケージをロードすると、データオブジェクトが内部パッケージ環境に自動的にアタッチされ、ユーザーが直接アクセスできないようにすることをお勧めします。

私の理解では、現在「data」にあるオブジェクトを含むパッケージの「R」ディレクトリに「sysdata.rda」ファイルを配置すると、望ましい結果が得られます。ただし、各オブジェクトをグループ化するのではなく、個別のファイルに入れることができるようにする方法はありますか?

4

2 に答える 2

15

sysdata.rdaファイルをdataパッケージのディレクトリに置きます。

Lazy Data を使用しないでください -- DESCRIPTION ファイルに LazyData の行が含まれていないか、含まれている場合は、次のようにする必要があります。LazyData: no

パッケージの R ディレクトリにある任意の .R ファイルに、次のような行を追加します。

data(sysdata, envir=environment())

data.frame名前付きを作成し、というパッケージのデータディレクトリにあるsysdataというファイルに保存しました sysdata.rdaanRpackage

上記の行を .R ファイルに追加し、パッケージ内の関数がデータにアクセスできることを示すために、このエクスポートされていない関数も追加しました。

foo <- function() tail(sysdata, 2)

次に、次のRセッションが表示されます

> library(anRpackage)
> sysdata
Error: object 'sysdata' not found

> anRpackage:::sysdata
  A  B C
1 1  6 a
2 2  7 b
3 3  8 c
4 4  9 d
5 5 10 e

> anRpackage:::foo()
  A  B C
4 4  9 d
5 5 10 e

したがって、ユーザーは引き続きデータにアクセスできますが、要求したとおり、直接アクセスすることはできません。ユーザーには、実行するオプションがまだありますdata(sysdata)

于 2012-09-07T21:53:36.600 に答える
12

.onLoad()パッケージが読み込まれるときにフックを使用して呼び出しdata()、データ オブジェクトを読み込む環境としてパッケージの名前空間を指定できます。

と呼ばれるパッケージのディレクトリにファイルがmodel1.Rあり、関数を定義すると仮定しますmydata.RDatadata/foopkg

.onLoad <- function(libname, pkgname) {
  data("model1", "mydata", package=pkgname, envir=parent.env(environment()))
}

あなたのパッケージのどこかに (例えばfoopkg-package.R)。

パッケージをビルドしてインストールしたら、

> library(foopkg)
> ls(loadNamespace("foopkg")) 

さまざまなデータ オブジェクトがパッケージの名前空間に正常にロードされたことを示す必要があります。つまり、パッケージ内の関数には表示されますが、グローバル環境は汚染されません。

于 2013-05-03T09:20:23.827 に答える