2012-03-01 18 views
27

私が開発しているRパッケージには、あらかじめ計算されたモデルやパラメータなど、いくつかのRデータオブジェクトが必要です。パッケージ内のRデータをどのように扱いますか?

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

私が代わりにしたいのは、パッケージを読み込む際に、データオブジェクトが自動的に内部パッケージ環境に接続され、ユーザーが直接アクセスできないということです。

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

+0

各オブジェクトを別々のファイルに配置する理由は、各オブジェクトを個別に参照するのはなぜですか?たとえば、「packagename ::: a」と「packagename ::: b」です。 –

+0

@the_skua個別のファイルは、パッケージ内のファイルバージョン管理を簡単にするのに便利でした。これはしばらく前のことでしたが、私はパッケージの一部としてモデルの適合性が異なっていたと思います。 – Nixuz

答えて

9

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

あなたのパッケージのどこかに機能

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

を定義し、ファイルにfoopkgと呼ばれるあなたのパッケージのdata/ディレクトリにmodel1.Rmydata.RDataを持っていると仮定すると(例えばfoopkg-package.Rで)。パッケージをビルドしてインストールした後

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

は、さまざまなデータ・オブジェクトが正常すなわち、あなたのパッケージの中の関数に見えるが、地球環境を汚染しない、パッケージの名前空間にロードされたことを証明しなければなりません。

12

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

は怠惰なデータを使用しないでください - あなたの説明ファイルが LazyDataの行を持つべきではないのいずれか、または、それがない場合、それはあなたのパッケージのRディレクトリ内の任意の.RファイルでLazyData: no

する必要がありますこの

data(sysdata, envir=environment()) 

のような行を追加し、私はdata.framesysdataという名前の作成と呼ばれるパッケージのデータディレクトリに sysdata.rdaと呼ばれるファイルに保存されてanRpackage

私は上記の行を.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)を実行するオプションがあります。

+3

この返答は質問に答えません。私はデータのアクセス可能範囲のスコープではなく、異なるファイルへのデータの分割について尋ねています。 – Nixuz

+1

あなたは現在、データディレクトリにたくさんのデータファイルがあるとします。そのため、これらのデータファイルごとに 'data(sysdata、envir = environment())'のような行を追加して、自動的に内部パッケージ環境にアタッチされ、ユーザが直接アクセスできないようにします。あなたが望むものを明確にしてください。 – GSee

関連する問題