8

残念ながら(f+g)(3)、f と g が両方とも単項関数であるようなことは R では機能しません。したがって、次の方法で単項関数の「+」演算子をオーバーロードしようとしました。

"+.function" = function(e1, e2){
  return(function(x) e1(x) + e2(x))
}

しかし、これを使用しようとすると、これは何もしません。コード

 a = function(x) 2*x
 (a+a)(2)

+.functionが定義されていない場合と同じエラーが発生します。

しばらく遊んでみると、実際にはこの方法で関数を追加できる可能性があることがわかりました。関数が参照クラスのメンバー関数である場合、これは機能します! つまり、次のコード (上記の "+" 定義と一緒に)

clsA = setRefClass("clsA", 
  methods = list(
    b = function(x) 2*x
  ))

inst_a = clsA$new()
(inst_a$b + inst_a$b)(2)

"8" を返します (予想どおり)。したがって、私はすでに私の問題に対するある種の回避策を持っています。今私の質問は次のとおりです。

この奇妙な動作の理由は何ですか? +.function「通常の」関数ではなく、クラスメンバー関数を気にするのはなぜですか? 演算子を通常の関数に「拡張」する方法を知っている人はいますか?

4

2 に答える 2

5

のクラスを再定義するとa、たとえば like class(a)<-"ownfunction"(またはさらに良いことに、 asをclass(a)<-c("ownfunction","function")作成すると機能します。"+.function""+.ownfunction"(a+a)(2)

クラスは特別な方法で処理されているようfunctionです: 実行すると、それが呼び出されていないdebug("+.function");(a+a)(2)ことがわかります。"+.function"

編集:コメントを参照してください。

于 2013-03-15T12:38:58.620 に答える
3

回避策として、次のような特別な演算子( %...%)を定義できます。

"%+%" <- function(e1, e2) {
  return(function(x) e1(x) + e2(x))
}

a <- function(x) 2*x
(a %+% a)(2) # == 8
于 2013-03-15T12:27:58.087 に答える