Какой лучший способ обойти конфликты имен функций в R? - PullRequest
2 голосов
/ 03 апреля 2020

При загрузке нескольких пакетов для работы с некоторыми данными я получил сообщение об ошибке при попытке использовать функцию select() из пакета dplyr. Я пытался использовать новый пакет (для меня), MASS, поэтому я мог легко диагностировать и работать правильно. Однако этот опыт заставил меня задуматься об оптимальном способе работы в мире множества пакетов с функциями, конфликтующими друг с другом.

Рассмотрим следующий код и сообщение об ошибке:

library(dplyr)
library(MASS)


df<-data.frame(Lobsters=c(1,3,4,5,7,1),Llamas=c(7,1,2,5,8,3))

df2<-df%>%
  select(Lobsters)

Ошибка в select (., Lobsters): неиспользованный аргумент (Lobsters)

Несмотря на то, что из-за этой ошибки выясняется, что select () создает для меня проблему, она не обязательно вызывает мне ясно, что проблема в том, что я не вызываю функцию select(), к которой я привык.

Я знаю, что могу вызвать функцию dplyr и получить желаемый результат, используя:

df2_alt<-df%>%
  dplyr::select(Lobsters)

Интересно, хотя:

  1. Существует ли лучшая практика диагностики проблем с одноименными функциями, кроме сообщений "Следующий объект маскируется из" когда загружен пакет?

  2. Является ли мой метод dplyr::select( лучшим способом обойти эти конфликты?

В конечном счете, мой текущий стратегия состоит в том, чтобы загрузить пакет, который имеет select() удовольствие ction Я буду использовать больше после пакета с менее часто используемой версией.

Ответы [ 2 ]

5 голосов
/ 03 апреля 2020

Вот некоторые вещи, которые можно сделать.

  1. При выполнении оператора library R перечислит все конфликты. Обратите на это внимание! Если вам необходимо узнать конфликты позже, введите: conflicts().

  2. Используйте аргумент exclude для library (R 3.6 и более поздние). например, library(MASS, exclude = "select"). dplyr clobbers base lag и filter, так что вы можете захотеть регулярно исключать их: library(dplyr, exclude = c("filter", "lag")) Вы можете получить к ним доступ, используя dplyr::lag, et c.

  3. Используйте примечание dplyr::select, если обнаружите, что оно замаскировано.

  4. detach любые пакеты, которые вы больше не используете, например detach("package:MASS").

  5. В некоторых случаях маскировка является доброкачественной, поскольку в новой версии она обратно совместима, и в этих случаях нет необходимости избегать конфликта.

  6. Как отмечает @LenGreski в комментариях, порядок пакетов будет определять разрешение любых конфликтов. Каждый пакет переопределяет все предыдущие пакеты, которые были загружены до него в случае конфликтов.

Существует также ряд пакетов, которые решают проблему конфликтов, включая конфликта (упомянуто @MrFlick), modules и import , которые все в CRAN, и второй пакет, также называемый modules , а не в CRAN.

2 голосов
/ 03 апреля 2020

Использование dplyr::select позволяет избежать двусмысленности. На мой взгляд, это лучшее, что вы можете сделать.

Недостаток отказа от вызова library(dplyr) заключается в том, что pipe недоступен. Вы все еще можете сделать library(magrittr), чтобы получить его доступным. Или вы можете взглянуть на красивый пакет import, который очень полезен, если вы не хотите прикреплять пакеты. В основном, если вы делаете import::from("magrittr", "%>%"), вы можете использовать трубу, не прикрепляя никакой пакет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...