13

その場で R パッケージ内に参照クラスを生成しようとしていますが、かなり難しいことがわかっています。私が取ったアプローチと私が遭遇した問題は次のとおりです。

スキーマを動的に読み取り、関連する参照クラスを自動的に生成できるようにするパッケージを作成しています (SOAP を考えてください)。もちろん、これは、パッケージ ソースで事前に参照クラスを定義することができないことを意味します。

私は最初、単純なものを使用して新しいクラスを作成しようとしました:

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

もちろん、インタラクティブに実行すると問題なく動作しますが、パッケージ ソースに含めるとlocked bindingエラーが発生します。私の読書によると、インタラクティブに実行すると、クラス情報がロックされていないグローバル環境に保存され、パッケージのベース環境がロックされているために、これが発生しているように見えます。

次に、次の効果を得るために何かを使用することを提案するスレッドを見つけました。

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

パッケージをビルドしようとしたときに実際に R/Studio がクラッシュしたため、残念ながら生成されたエラーのログはありませんが、確かに機能しませんでした。

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

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

これは実際には問題なく動作するように見えましたが、次の警告が生成されます。

> 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()パッケージの検出に役立つ機能を追加できますか? 警告に対処できる場合でも、これは機能しますか、または参照クラスを動的に作成しようとして誤用していますか?

4

1 に答える 1

5

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

したがって、実際に警告を回避できます

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

これにより警告は解決されますが、ドキュメントには.packageName変数を無期限に信頼しないように書かれています。私はまだこれをハッキングしているように感じており、参照クラスとそれらの環境との関係について重要なことを誤解している可能性があります.

ドキュメントからの完全な詳細:

パッケージ名は通常、パッケージのロード中に INSTALL スクリプトまたはライブラリ関数によってインストールされます。(現在、名前はオブジェクト .packageName として保存されていますが、今後は信頼しないでください。)


編集

もう少し読んだ後、このsetPackageName方法は、環境のパッケージ名を設定するためのより信頼できる方法である可能性があります。ドキュメントごと:

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

したがって、有効な解決策の1つは次のようになります。

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

これにより、警告メッセージがなくなり、不安定であると文書化されているものに依存しなくなります。なぜそれが必要なのかはまだわかりませんが...

于 2013-04-23T15:55:46.673 に答える