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