dplyr :: столкновение функции выбора с MASS::select

#r #dplyr

#r #dplyr

Вопрос:

Если я загружу MASS пакет:

 library(MASS)
  

затем загрузка пытается запустить dplyr::select , я получаю сообщение об ошибке:

 library(dplyr)
mtcars %.%
select(mpg)

# Error in select(`__prev`, mpg) : unused argument (mpg)
  

Как я могу использовать dplyr::select с MASS загруженным пакетом?

Комментарии:

1. Вы можете использовать его так, как вы только что написали: dplyr::select(mpg)

2. По состоянию на сегодняшний день 03.12.2019, пять лет спустя, это все еще не исправлено, у меня просто была точно такая же проблема.

Ответ №1:

Как сказал Паскаль, работает следующее

 require(MASS)
require(dplyr)
mtcars %>%
   dplyr::select(mpg)
  

Комментарии:

1. Если вы уверены, что собираетесь загружать MASS и dplyr вместе очень часто и часто используете ‘select’, вы могли бы переназначить функцию: select <- dplyr::select, что может помочь сэкономить при повторном вводе ‘dplyr::’

2. Я знаю, что это устарело, но в любом случае. Только что столкнулся с той же проблемой. И, по-видимому, MASS импортируется (среди прочего) ggplot2, поэтому я думаю, что многие, вероятно, будут использовать их вместе. Хотя я считаю, что раньше я использовал ggplot2 и dplyr без проблем…

3. У меня похожая проблема. Однако странно то, что эта проблема не возникала до сегодняшнего дня, и я действительно не менял свой код. Я только подключил раздел, вызывающий ошибку, к if(x == x) { ... } условию. Есть идеи, почему внезапно появляется эта ошибка, когда раньше проблем не было?

4. @deca, я понятия не имею, возможно, вы захотите задать это как отдельный вопрос.

5. также конфликтует с пакетом, который следует использовать, как указано выше drc dplyr:select

Ответ №2:

Это случается со мной чаще, чем я должен признать. dplyr конфликтует с MASS::select , plyr::summarise и stats::filter среди прочего, особенно при загрузке пакетов, которые загружают одну из этих библиотек через library (они не должны, но некоторые все еще делают) или когда вы загружаете dplyr в свой .Rprofile (не делайте!).). И это может привести к довольно неясным проблемам, не всегда сообщению об ошибке, особенно конфликтам с. plyr

Я только недавно узнал об этой conflicts() функции. Это полезно, но конфликты «чрезмерных отчетов» возникают, когда два пакета имеют идентичные функции, например, tidyr:: %>% и dplyr:: %>% .

Итак, я написал функцию, чтобы сообщить мне, схожу ли я с ума или на самом деле существует конфликт, вызывающий текущую ошибку. Он не только проверяет наличие конфликтов, но и проверяет, является ли определенный желаемый пакет тем, который находится «сверху», и действительно ли тела функции отличаются.

Она делает это для dplyr по умолчанию, но вы можете указать другой пакет, используя want_package параметр. Например, я часто сталкиваюсь с recode и alpha , которые повторно используются во многих пакетах.

Использование просто: amigoingmad() .

По умолчанию он также автоматически «исправит» ситуацию, если dplyr не находится «на вершине», используя следующие команды:

 detach("package:dplyr", character.only = TRUE)
library("dplyr", character.only = TRUE)
  

Обратите внимание, что функция сообщит, если указанная пользователем функция блокирует dplyr, но не исправляет это автоматически в целях безопасности (в этом случае просто удалите функцию).

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

Если вы хотите, чтобы это было в пакете:

 devtools::install_github("rubenarslan/rcamisc")
  

Комментарии:

1. Красивые. Я думал, что схожу с ума.

2. Не могли бы вы обновить этот ответ, я думаю, что функции, на которые вы ссылаетесь, больше не находятся в репозитории

3. @saQuist спасибо, я переместил его в другой пакет. исправлены ссылки.

Ответ №3:

Если вы загружаете сначала MASS библиотеку, а затем dplyr

 library (MASS)
library (dplyr)
  

тогда первой версией select функции в вашем сеансе searchpaths () будет версия в dplyr библиотеке.

Следовательно

 select(mtcars, mpg)
  

будет работать как

 dplyr::select(mtcars, mpg)
  

Комментарии:

1. 1 за подсказку searchpaths() для самопроверки. Я обнаружил, что library(tidyverse) загружает MASS перед dplyr — это вызывает частую ошибку! Таким образом, обходным путем является явная загрузка MASS перед tidyverse, например library(MASS); library (tidyverse)

Ответ №4:

Другие решения, перечисленные здесь, могут решить вашу непосредственную проблему, но критически не работают: они не могут сообщить вам о конфликтах, которые неизвестны заранее. Например, я только что обновил некоторый старый код и обнаружил, что в трех пакетах, которые я использовал, у каждого есть summarize команда.

Элегантным решением является загрузка conflicted пакета в каждом сеансе / скрипте, поскольку он:

  • генерирует информативные сообщения об ошибках всякий раз, когда возникают конфликты пространств имен
  • предлагает явную функцию conflict_prefer() для назначения приоритета пространства имен
  • не требует более громоздкого package::function() синтаксиса

Смотрите Пример кода ниже частично из https://github.com/r-lib/conflicted

 # install package
install.packages("conflicted")

# example of how to start load packages at start of your script
library(dplyr)

library(conflicted)
conflict_prefer("select", "dplyr")
conflict_prefer("filter", "dplyr")
  

Ниже приведен пример, как если бы вы запускали library(conflicted) при запуске, но не указали, какой пакет получает приоритет для filter :

 # WITHOUT conflict_prefer("filter", "dplyr")
# example of informative error message

filter(mtcars, cyl == 8)

#> Error: [conflicted] `filter` found in 2 packages.
#> Either pick the one you want with `::` 
#> * dplyr::filter
#> * stats::filter
#> Or declare a preference with `conflicted_prefer()`
#> * conflict_prefer("filter", "dplyr")
#> * conflict_prefer("filter", "stats")
  

Ниже приведен пример с library(conflicted) и conflict_prefer("filter", "dplyr") :

 # WITH conflict_prefer("filter", "dplyr") as suggested at top
# R knows to assign priority 

library(conflicted)
conflict_prefer("filter", "dplyr")

filter(mtcars, cyl == 8) %>% head(2)
#    mpg cyl  disp  hp drat   wt  qsec vs am gear carb
# 1 18.7   8 360.0 175 3.15 3.44 17.02  0  0    3    2
# 2 14.3   8 360.0 245 3.21 3.57 15.84  0  0    3    4
  

Ответ №5:

Как и в приведенном выше комментарии KFB, одно простое решение, которое я нашел, заключается в:

  1. загружайте свои пакеты
  2. не беспокойтесь о порядке (что может быть сложно с зависимостями)
  3. назначьте приоритет тому пакету, который вы предпочитаете «владеть» пространством имен:
 select <- dplyr::select

filter <- dplyr::filter
  

Например, посмотрите, как environment: namespace изменяются следующие изменения:

 library(MASS)
select

  function (obj) 
  UseMethod("select")
  <bytecode: 0x7fbe822811b8>
  <environment: namespace:MASS>  # from MASS::select() <---------

select <- dplyr::select
select

  function (.data, ...) 
  {
      UseMethod("select")
  }
  <bytecode: 0x7fbe7c4a2f08>
  <environment: namespace:dplyr> # now dplyr::select() <---------
  

Ответ №6:

После того, как я попробовал множество альтернатив, у меня сработало удаление MASS и его повторная установка.