dplyr :: select函数与MASS :: select冲突


67

如果我加载MASS包裹:

library(MASS)

然后加载尝试运行dplyr::select,我得到一个错误:

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

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

如何使用dplyr::selectMASS加载的软件包?


6
您可以使用它,就像您刚写的一样:dplyr::select(mpg)

截至今天03.12.2019,五年后仍未解决,我只是遇到了完全相同的问题。
天行者

Answers:


72

正如Pascal所说,以下作品

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

32
如果您确定要经常同时加载MASS和dplyr并经常使用'select',则可以重新分配该功能:select <-dplyr :: select可以帮助保存重复输入'dplyr ::'的信息
KFB

2
我知道这很老,但无论如何。刚遇到同样的问题。MASS显然是由ggplot2导入的(因此),所以我想许多人可能会一起使用它们。虽然我相信我之前一直在使用ggplot2和dplyr,但是没有问题...
Latrunculia

我有一个类似的问题。但是,很奇怪的是直到今天才出现此问题,而且我并没有真正更改我的代码。我只将导致错误的部分插入if(x == x) { ... }条件中。为什么突然出现此错误,以前没有问题的任何想法?
deca

@deca,我没有任何想法,您可能想将其作为一个单独的问题提出。
r.bot

20

这件事在我身上的发生频率比我应该承认的高。dplyr上有冲突MASS::selectplyr::summarise以及stats::filter除其他事项外,尤其是当装载包,其载荷通过图书馆的图书馆之一(他们不应该,但仍有部分做的),或者当您在加载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-file并可能不小心弄乱了装载顺序时,这是一种快速查找方法。

如果要在包装中添加:

devtools::install_github("rubenarslan/formr")

2
美丽。我以为我快疯了。
nigelhenry

11

如果加载第一MASS图书馆和第二dplyr一个

library (MASS)
library (dplyr)

那么select您会话中该函数的第一个版本searchpaths ()将是dplyr库中的那个版本。

因此

select(mtcars, mpg)

将作为

dplyr::select(mtcars, mpg)

+1提示searchpaths()进行自我检查。我发现library(tidyverse)在dplyr之前加载了MASS-这会导致频繁的错误!因此,解决方法是在tidyverse之前显式加载MASS,例如library(MASS); library (tidyverse)
Agile Bean

8

就像上面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() <---------

5

此处列出的其他解决方案可能会解决您的迫在眉睫的问题,但会以严重的方式失败:它们无法告诉您事先未知的冲突。例如,我刚刚更新了一些旧代码,发现我正在使用的三个软件包都有一个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 a 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.