2012-08-05 10 views
6

私は%X%という名前のバイナリ演算子関数を書いたので、%X%(a,b)の代わりに、より便利な構文a %X% bを使用することができます。<-のラッパーその環境内のオブジェクトに対して行われ、そのオブジェクトを上書きする前にユーザに警告する '保護された'属性があるかどうかを確認します。Rでは、バイナリ演算子のsys.call()にコマンドライン全体を渡す方法は?

私が試してみると、この機能のすべての中にa %X% b + ca %X% b _andこれも全てです; aはbの値を割り当てられ、cは完全に無視されます。a %X% (b + c)が動作しますので、%X%(a, b + c)も同様ですが、これをab inary演算子はかっこを避けることです。

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

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

a %X% 3 + 1:10; 

所望の結果が "%のX%3 + 1時10分" 観察結果は "%のX%3"

:ここ

は、この問題を複製するコードでありますありがとう。

+1

奇数;私がコード(R 2.15.1)を実行すると、%X%3 + 1:10のエラーが発生し、バイナリ演算子に数字以外の引数を返します。 –

+0

@DavidRobinson、エラーは '+'演算子からのものです型の文字の 'a%X%3'の出力を数値型の' 1:10'で合計します。 – flodel

答えて

2

私は、カスタム演算子の優先順位を下げる方法はないと考えています。私は実際にどのように<-派遣作品を理解していない私は私のオペレータ<<-

に名前を付けることができ、との<-(なしの異なるオブジェクト固有のメソッドのための数十がなければならない。しかし、私は安っぽい回避策を見つけたと思いますmethods( <に表示 - 。)私が知っているすべては、私はスタッフ休憩の<-すべての種類をオーバーライドするときということです

しかし、<<-<-に近い優先度を持ち、かつので時折場合のところ、それは特に有用ではないのです。あなたは本当にする必要があります関数またはループの中からグローバル変数を書き込む場合は、またはassign('foo',bar,env=.GlobalEnv)を使うことができます。

さらに、私は最初に.GlobalEnvにオブジェクトのログと書き込みを試みているので、<<-に割り当てている新しい意味は元のものといくらか一致しています。

6

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

+0

好奇心から: '< - '/'='はどのように働くのですか?私はそれをバイナリ演算子ではない –

+0

@DavidRobinson、 '< - 'と '='はバイナリ演算子であり、優先順位は非常に低く、 '?Syntax'を参照してください。 – flodel

関連する問題