2016-10-10 11 views
2

パイプ内の名前空間を使用して関数を呼び出すときに、コードの最後の行の動作に違いがあり、エラーメッセージが実際に意味するもの:関数の演算子の優先度がパイプの名前空間によって呼び出される

library(magrittr) 
1:5 %>% cumsum 
#### [1] 1 3 6 10 15 
1:5 %>% cumsum() 
#### [1] 1 3 6 10 15 
1:5 %>% base::cumsum() 
#### [1] 1 3 6 10 15 
1:5 %>% (base::cumsum) 
#### [1] 1 3 6 10 15 
1:5 %>% base::cumsum 
#### Error in .::base : unused argument (cumsum) 

私は本当にそれが最高の優先度が遠く離れて特別な事業者から、名前空間演算子::ためのものであることをoperator precedence rules状態以来、働くだろうと思いました。

ありがとうございました。

答えて

3

base::cumsumは何も引数をとらないfunction (x) .Primitive("cumsum")を返します。これはエラーの内容です。上記の行を参照して()を追加すると、1:5引数で関数が呼び出されます。

さらに良い例は、独自の機能です。その後、

foo<-function(){cat("hello")} 

引数なしで呼び出された場合、そのコードを返します:

> foo 
function(){cat("hello")} 

は、だから、base::cumsumと似ていますが、私はそれが何らかの形で保護されて推測するか、単にそれはあなたにその説明を示しているプログラム。

+0

ありがとうございますが、このプリミティブ関数が正確に何をしているのかはわかりません...パッケージの名前空間を指定すると、同じ関数ではありません。 – agenis

+0

のように、はい。 '()'を置かないと、 'namespace'からの呼び出しにかかわらず、引数を渡す意味で関数として扱われません。変数の名前を入力するだけで、それが印刷されるようなものです。関数のいくつかの説明が出力されるので、あなたが引数を渡すことを期待せず、試してみるとエラーがスローされます。 –

+0

それは私が 'str(cumsum)'と 'str(base :: cumsum)'を実行するときに同じことが起こるので変です。あなたは偶然このテーマを読むための文書をお持ちですか? – agenis

関連する問題