2

以外の環境にメソッドをソースすることは可能.GlobalEnvですか?

私は R のマスキング メカニズムに少し不満を感じています (この点に関しては、おそらく独自の質問に戻ってくるでしょうが、興味がある場合は、今のところ、パッケージRMySQLRSQLite同じプロセスで使用して、それらをロードしてみてください。この順序; RMySQL がクラッシュします)、すべてのスクリプト全体<namespace>::foo()ではなく、一貫して使用するように切り替えたいと考えています。foo()

ただし、<namespace>::foo()「ローカル コピー」を使用するよりも効率的ではありません (たとえばnamespace..foo <- <namespace>::foo()、興味のある人のために例を提供できますが、自分でテストするのは非常に簡単です)。

(ほとんどの場合)名前空間あるため、ローカル コピーを作成すると、読み込んでいる他のパッケージの扱いがうまくいきますが、自分のコードが「パッケージ」になる前はそうではありませ

だから私は「自分のものをソースにNS <- newenv(parent=emptyenv())して、他のパッケージと同じルーチンを適用しましょう」と思いました。しかし、Rは私を許しません:

setGeneric(
    name="fooBar",
    signature=c("src"),
    def=function(src, ...){
        standardGeneric("fooBar")    
    }
)
setMethod(
    f="fooBar",
    signature=signature(src="character"),
    definition=function(src, ...){
        cat(src, sep="\n")        
    }
)
# These would go into: 
"Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R"
"Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R"

# This works:
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R")
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R")

# This does not:
NS <- new.env(parent=emptyenv())
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R", local=NS)
source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R", local=NS)

eval(parse(file="Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R"), envir=NS)
eval(parse(file="Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R"), envir=NS)

エラー:

> source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/gnrc.R", local=NS)
Error in eval.with.vis(expr, envir, enclos) : 
  could not find function "setGeneric"
> source("Q:/usr/wsp/3.6.2/32bit/root/_SCRATCH/mthd.R", local=NS)
Error in eval.with.vis(expr, envir, enclos) : 
  could not find function "setMethod"

私が間違っているかもしれないことは何ですか?

4

1 に答える 1

3

ああ、神様!申し訳ありませんが、これはやや恥ずかしいです:

環境をキャッシュするときのメモリバルーニングを防ぐために、一貫して使用するように切り替えましたがnew.env(parent=emptyenv())、それに慣れすぎて、時々異なる親環境を持つことが理にかなっていることを忘れていました;-)

この場合NS <- new.env()、トリックを行います。

于 2011-11-11T14:31:57.703 に答える