関連記事があるが、回答が不十分であることは知っている。だからこの質問に真剣に答えてください。複数のパッケージが使用されている場合、汎用関数を定義する場所と方法
2つの異なるハードウェアデバイスを制御する2つのパッケージ( "keithley"と "xantrex")があります。従って、両者は互いに独立している。それぞれは別々に初期化する必要があります。だから私は、二つの方法の一般的なS3機能init(inst,...)
ため
init.keithley(inst,...) # in keythley package
と
init.xantrex(inst,...) # in xantrex package
を書きました。 keithley
パッケージとxantrex
パッケージでジェネリック関数を宣言しようとしましたが、後者がロードされてもメソッドが見つからない場合はマスクされます。私が試した何
は.onAttach()
-hook
.onAttach <- function(libname, pkgname)
{
if(!exists("init"))
eval(expression(init <- function(inst,...) UseMethod("init")),envir = .GlobalEnv)
}
あるしかし、これでは、パッケージの名前空間内のinit()
機能を評価することはできません。これは、オプションenvir = environment()
で証明できますが、これは動作しません。私もsetGenericS3()
とsetGeneric()
と同じ結果を試しました。 "汚い"ソリューションは、3番目のパッケージを定義してインポートすることができますが、これを行うにはきれいな方法が必要です。
どこでどのように汎用関数を定義する必要がありますか?ここで
以下は機能しますか? 'keithley :: init(...)'と 'xantrex :: init(...)' – lmo
これはうまくいくはずですが、意図したものではありません。これらのパッケージは、 'init(keith)'や 'init(xan)'などの行で明示的に名前空間を呼び出して使用する必要があります。 – Seily
は 'environment(init)< - asNamespace( 'xantrex')'は動作しますか?あなたのonAttachで使用される – rawr