приоритет оператора для функции, вызываемой пространством имен в конвейере

Пожалуйста, кто-нибудь может объяснить, почему существует разница в поведении последней строки кода, когда я вызываю функцию, используя ее пространство имен в канале, и что на самом деле означает сообщение об ошибке:

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)

Я искренне думал, что это сработает, поскольку правила приоритета операторов заявляют, что наивысший приоритет имеет оператор пространства имен ::, а не специальные операторы.

Спасибо.


person agenis    schedule 10.10.2016    source источник


Ответы (1)


Я думаю, это потому, что он вызывает описание функции, base::cumsum возвращает function (x) .Primitive("cumsum"), который не принимает никаких аргументов, о чем и говорит ошибка. Как только вы добавите (), как вы видите строку выше, она вызовет функцию с аргументом 1:5.

Еще лучший пример с вашей собственной функцией.

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

затем возвращает свой код, если вызывается без аргумента:

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

Так что это похоже на base::cumsum, но я предполагаю, что он как-то защищен или просто запрограммирован, что дает вам это описание.

person Jan Sila    schedule 10.10.2016
comment
спасибо, но мне все еще неясно, что именно делает эта примитивная функция... вы говорите, что когда мы указываем пространство имен пакета, это не та же самая функция? - person agenis; 10.10.2016
comment
типа да. если вы не поместите (), то она не будет рассматриваться как функция в смысле передачи ей аргумента независимо от вызова ее из ее namespace. это похоже на то, что если вы просто набираете имя переменной, оно распечатывается. Теперь распечатывается некоторое описание функции, поэтому она не ожидает, что вы передадите ей аргумент, и выдает ошибку, если вы попытаетесь это сделать. - person Jan Sila; 10.10.2016
comment
это странно, потому что когда я запускаю str(cumsum) и str(base::cumsum), я получаю одно и то же. У вас случайно нет документа на эту тему? - person agenis; 10.10.2016
comment
Да, я ожидал этого, потому что вы вызываете функцию «описание». Я думаю, что даже лучше, если вы напишете свою функцию, а затем вызовете ее без скобок. foo<-function(){cat("hello")} возвращает точно его содержимое. к сожалению, точных документов нет, только личный опыт, извините. Может еще кто посодействует? - person Jan Sila; 10.10.2016