R: Использование pipe%>% и pkg :: fo приводит к ошибке «Ошибка в. :: base: неиспользованный аргумент» - PullRequest
0 голосов
/ 05 марта 2019

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

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

library(magrittr)
c(1,2) %>%
  base::mean
#> Error in .::base: unused argument (mean)

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

То, что происходит, заключается в том, что 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)
0 голосов
/ 05 марта 2019

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

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

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

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

0 голосов
/ 05 марта 2019

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

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

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

...