1

高度なプログラミング言語では、任意のクラスのパブリック関数は、このクラス (オブジェクト) のインスタンスの呼び出しによって実行できます。たとえばa=new Foo(); a.somePublicFunction();、R でこのプログラミング パラダイムを使用したい場合は、次のコードを記述します。

 setClass(Class = "Foo",
          representation = representation(a="numeric")
 ) 
 Foo<-function(a=1){new("Foo",a=a)}
 myFunction.Foo<-function(object){
    return(object@a)
 }
 setGeneric("myFunction", function(object) standardGeneric("myFunction"))
 setMethod("myFunction", signature = "Foo", definition = myFunction.Foo)

myFunctionで簡単にオーバーライドできるのはなぜmyFunction<-1/3ですか? を呼び出す場合myFunction(obj)、どこでobj is an object of classFoo , the interpreter should refer tomyFunction.Foo`. Rでこの問題を処理するには?

4

1 に答える 1

1

通常、クラスとメソッドはパッケージで定義されます。パッケージには、シンボルが定義されている (ロックされた) 名前空間があります。ユーザーは任意のシンボルを再定義できますが、これはグローバル環境で行います。基になるシンボルには引き続きアクセスできます。ベースR:

> pi
[1] 3.141593
> pi = "apple"
> pi
[1] "apple"
> base::pi
[1] 3.141593

またはもう少し微妙に、Rが関数と変数について知っていることを示します

> log(1:5)
[1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379
> log = "pine"
> log
[1] "pine"
> log(1:5)
[1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379

何が起こっているかについての基本的な理解には、環境 (名前空間は特殊なケースです)、search()パス、および R のシンボルと環境内の値の関連付けが含まれます。シンボルは環境内で一意でなければなりません (したがって、グローバル環境でのmyFunction <- 1/3以前の定義を上書きします)。myFunctionシンボルは、検索パスに沿って動的に見つけることができます ( によって返されるようにsearch()、またはパッケージ内で最初にパッケージ名前空間を調べ、次にベース環境を調べ、次にユーザーに表示される検索環境に沿ったより複雑な方法で)。

于 2013-06-17T14:27:53.817 に答える