2015-10-26 10 views
14

Rのすべてが機能していると読んだことがあります。算術演算子を関数として扱う

xx <- c(1,2,3) 
yy <- c(1,2,3,4,5,6) 

# zz is the sum of the two lengths 
zz <- +(if(exists("xx")) length(xx), if(exists("yy")) length(yy)) 
+3

'+'の代わりに 'sum'を使用する – akrun

+5

' + '実際にはダニを追加するだけの機能です。 –

+0

しかし、 'if(exists())'を使った構造は '+'関数呼び出しの中で期待どおりに動作しません。変数の1つが存在しない場合はどうなるか試してみてください。基本的に '1 + NULL'のようなことをします。 – Roland

答えて

21

はい、次のことができます:

xx <- c(1,2,3) 
yy <- c(1,2,3,4,5,6) 

# zz is the sum of the two lengths 
zz <- `+`(if(exists("xx")) length(xx), if(exists("yy")) length(yy)) 
#[1] 9 

構文的に有効持たないオブジェクトを呼び出すために「+」があまりにも 、我々はそのような何かを書くことができる場合、関数であれば、私は疑問に思います(例えば、あなたが1 + 2ような何かを行う場合は、暗黙的に呼び出される関数+など)の名前あなたはバッククォート( `)または二重引用符(」または「)で名前を囲む必要があります。

も参照してくださいR Language Definitionの3.1.4 :0あなたは(バイナリ)機能"+"が、関数の引数を期待していない単項演算子+を呼び出すことはありませんので、これは

Error: unexpected ',' in "zz <- +(if(exists("xx")) length(xx)," 

:あなたのコードで

Except for the syntax, there is no difference between applying an operator and calling a function. In fact, x + y can equivalently be written `+`(x, y). Notice that since ‘+’ is a non-standard function name, it needs to be quoted.

は、エラーが発生しますかっこを「算術」演算子として解釈します。それらの間にカンマは使用できません。

+3

一重引用符または二重引用符も使用すると、 '' + '(1,1) 'と'' + '(1,1) 'の両方がバッククウックのソリューションと同様に動作します。 – Gregor

+1

あなたの最後の文章には曖昧さがあります。演算子の「内部」はありません。ルールは、関数引数を区切るときに* except *を使用できるカンマがないことです。 – Frank