2013-04-23 14 views
13

私はRパッケージ内で参照クラスを生成することを試みていますが、それはかなり困難です。参照クラスを動的に生成

私は動的にスキーマを読み込み、関連する参照クラスを自動的に生成することを望んでいるパッケージを作成しています(SOAPと思う) 。もちろん、これは、私がパッケージソースの中で自分の参照クラスを事前に定義することができないことを意味します。

は、私は当初、単純なを使用して新しいクラスを作成しようとしました:対話的に実行されますが、パッケージのソースに含まれたとき、私は locked bindingエラーを取得するときはもちろん、正常に動作し、

myClass <- setRefClass("NewClassName", fields=list(fieldA="character")) 

。私の読んだところでは、これは対話的に実行すると、クラス情報がロックされていないグローバル環境に格納されているため、パッケージのベース環境がロックされているために発生します。

私は、その後の効果に何かを使用して提案されたスレッドが見つかりました:

myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=globalenv()) 

私はパッケージをビルドしようとしたとき、これは実際にR /メーカークラッシュしたので、私はエラーのログを持っていません残念ながらそれは発生しましたが、確かに機能しませんでした。

次へ私は、これらの参照クラスを格納するために使用できるパッケージ内に新しい環境を作成しようとしました。だから私は(ない任意の関数の内部で)私のパッケージソースで.classEnv <- new.env()行を追加し、新しい参照クラスを作成するときに、このクラスを使用しようとしました:

myClass <- setRefClass("NewClassName", fields=list(fieldA="character"), where=.classEnv) 

これは実際にOK動作するように見えますが、次の警告を生成し、 :

> myClass <- setRefClass("NewClassName", where=.classEnv) 
Warning message: 
In getPackageName(where) : 
    Created a package name, ‘2013-04-23 10:19:14’, when none found 

ので、何らかの理由で、methods::getPackageName()は私の新しい環境がどのパッケージをピックアップすることはできないのですか?

getPackageName()がパッケージを正しく認識できるように、新しい環境を別に作成する方法はありますか? getPackageName()がパッケージを検出するために役立つ機能を追加できますか?警告に対処することができればこれが機能するのでしょうか、または動的に参照クラスを作成しようとして誤用していますか?

+0

'?setRefClass'は'?setClass'に '?setClass'引数が渡され、これに' package'という引数があります。引数 'package = 'YourPackage''などで3番目のアプローチをしたいですか? –

+0

チップ、マーティンありがとう。残念ながら、それはエラーを取り除くことができませんでした。 '.packageName'変数がまだ指定されていなければ、警告が出てくる' getPackageName'まで、パッケージ名が少しずつ流れていないようです。 –

答えて

5

会話をするために、getpackageNameは、指定された環境の変数.packageNameにパッケージ名を格納することがわかりました。

だから、実際に警告を解決

assign(".packageName", "MyPkg", envir=.classEnv)  
myClass <- setRefClass("NewClassName", fields=classFields, where=.classEnv) 

で警告を回避することができますが、ドキュメントは無期限.packageName変数を信用していないと言うと、私はまだ私はこれをハッキングてるような気がしてもよく、参照クラスとその環境との関係について重要なことを誤解している可能性があります。ドキュメントから

完全な詳細:

パッケージ名は、通常、INSTALLスクリプトによって、またはライブラリ関数によって、パッケージの読み込み時にインストールされています。 (現在、名前はオブジェクト.packageNameとして保存されますが、将来これを信頼しません。)


編集

さらに少し読んだ後、setPackageName方法は、環境のためにパッケージ名を設定するには、より信頼性の高い方法かもしれません。ドキュメント別:

setPackageNameこれ以外の方法ではパッケージ名を設定しない環境では、パッケージ名を設定できます。これにより、任意の環境でクラスやメソッドを作成することができますが、標準のRプログラミングツール(package.skeletonなど)を使用してパッケージを作成するのが通常です。

これは、警告メッセージを排除し、不安定と記録されたものに依存しません。なぜそれが必要なのかまだ分かりませんが...