#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, одно простое решение, которое я нашел, заключается в:
- загружайте свои пакеты
- не беспокойтесь о порядке (что может быть сложно с зависимостями)
- назначьте приоритет тому пакету, который вы предпочитаете «владеть» пространством имен:
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 и его повторная установка.