Я использую канал magrittr%>%, за которым сразу следует функция, вызываемая: package :: function, и получаю сообщение об ошибке: Ошибка в. :: base: неиспользуемый аргумент (среднее значение)

В чем проблема?

library(magrittr)
c(1,2) %>%
  base::mean
#> Error in .::base: unused argument (mean)
4
Matifou 5 Мар 2019 в 00:58

3 ответа

Лучший ответ

Происходит то, что magrittr запутывается в том, в какую именно функцию вы хотите вставить предыдущее значение. Когда вы просто

c(1,2) %>%
  mean

magrittr может легко увидеть, что mean является символом, указывающим на среднюю функцию. Но когда вы делаете base::mean, все становится немного сложнее, потому что :: также является функцией в R. Давайте сравним разницу между base::mean и base::mean() в R с точки зрения того, как они переводятся в вызовы функций.

as.list(quote(base::mean))
# [[1]]
# `::`    
# [[2]]
# base    
# [[3]]
# mean

as.list(quote(base::mean()))
#  [[1]]
# base::mean

Вы можете увидеть эти разборы по-разному. Когда вы просто наберете base::mean, R сначала увидит функцию :: и попытается передать туда числа. В основном чтобы звонит

`::`(., base, mean)

Что не имеет смысла, может это то, что дает вам это конкретное сообщение об ошибке

Но если вы явно добавите (), R увидит, что вы пытаетесь вызвать функцию, возвращенную из base::mean, поэтому он добавит параметр в нужное место. Так что вы можете сделать

c(1,2) %>%
  base::mean()

Или

c(1,2) %>%
    (base::mean)
5
MrFlick 4 Мар 2019 в 22:18

Обратите внимание, что существует версия magrittr, у которой нет этой проблемы, но она не была отправлена в CRAN в течение очень долгого времени.

Как описано в этой проблеме, версия github-версий каналов magrittr может успешно справляться

c(1,2) %>%
    base::mean
[1] 1.5

Это было исправлено 4 года назад, но никогда не было в CRAN. Поскольку большинство людей будет использовать версию CRAN, я бы не советовал писать код, который зависит от этого исправления.

2
OganM 4 Мар 2019 в 23:23

Оказывается, если вы вызовете функцию с дополнительным аргументом, она не будет работать. Простое решение - использовать (.), то есть base::mean(.):

library(magrittr)
c(1,2) %>%
  base::mean(.)
#> [1] 1.5

Это объясняется более подробно в: magrittr и wrapr Pipes in R, экзамен

0
Matifou 4 Мар 2019 в 21:58