6

Rの二項演算子関数を作成しました(つまり、%X%入力する代わりに%X%(a,b)、より便利な構文を使用できるように、のような名前の関数を作成しました。私の目標は、その中のオブジェクトに対して行われたことをログに記録するなどa %X% bのラッパーを作成することです。<-環境を設定し、そのオブジェクトを上書きする前にユーザーに警告する「保護された」属性を確認します。

a %X% b + cこれはすべて機能しますが、関数内のようなことを実行しようとすると、表示されるのはa %X% b_であり、それだけです。aにはbの値が割り当てられ、cは完全に無視されます。a %X% (b + c)動作します%X%(a, b + c)が、これを二項演算子として記述することの全体的なポイントは、括弧を避けることです。

を上書きする<-と、そのsys.call()左右のすべてが表示されます。コマンドラインから隣接する名前だけが表示されるのはなぜですか?

この問題を再現するコードは次のとおりです。

`%X%` <- function(...){
    print(deparse(sys.call()));
}

a %X% 3 + 1:10;

望ましい結果は「%X%3 + 1:10」です。観測された結果は「%X%3」です。

ありがとう。

4

2 に答える 2

6

これは、演算子の優先順位と関係があり?Syntaxます。詳細については、を参照してください。%any%定義しようとしているような特殊な演算子( )は、バイナリよりも優先順位が高いと書かれている+ので、括弧を使用して実行する以外に方法(AFAIK)はありませんa %X% (b + c)

于 2012-08-05T03:07:45.657 に答える
2

カスタム演算子の優先順位を下げる方法はないと思います。しかし、私は安っぽい回避策を見つけたと思います:私は私のオペレーターに名前を付けることができます <<-

ディスパッチがどのように機能するかはよくわかりません。<-オブジェクト固有のさまざまなメソッドが必要です( <-<-に表示されるものはありません。私が知っているのは、あらゆる種類のデータブレークをオーバーライドするときだけです。methods()<-

ただし、<<-の優先順位はに近く<-、関数またはループ内からグローバル変数を実際に書き込む必要がある場合には、またはを使用できるため、特に便利ではありませ.GlobalEnv[['foo']] <- barassign('foo',bar,env=.GlobalEnv)

その上、私はそもそも.GlobalEnvでオブジェクトをログに記録して書き込み保護しようとしているだけなので、割り当てている新しい意味は元の意味と<<-ある程度一致しています。

于 2012-08-05T06:21:21.303 に答える