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

时间:2014-06-13 09:32:45

标签: r dplyr

如果我加载MASS包:

library(MASS)

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

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

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

如何在加载dplyr::select包时使用MASS

6 个答案:

答案 0 :(得分:60)

正如Pascal所说,以下作品

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

答案 1 :(得分:19)

这种情况比我应该承认的更频繁。 dplyr与MASS::selectplyr::summarisestats::filter冲突,特别是在加载通过库加载其中一个库的软件包时(它们不应该,但有些仍然可以)或者当你加载时在你的.Rprofile中加载dplyr(不要!)。它可能导致相当模糊的问题,并不总是错误信息,尤其是与plyr的冲突。

我最近才了解conflicts()功能。它很有用,但当两个包具有相同的功能时,“过度报告”冲突,例如tidyr :: %>%和dplyr :: %>%

所以我写了a function来告诉我,如果我生气,或者是否真的存在导致当前错误的冲突。它不仅检查冲突,还检查某个所需的包是否是“在顶部”的包,以及该功能的实体是否实际上不同。

默认情况下,它为dplyr执行此操作,但您可以使用want_package参数指定另一个包。例如,我经常被recodealpha绊倒,这些都会在许多包中重复使用。

用法很简单:amigoingmad()

默认情况下,如果dplyr不在“顶部”,它还会自动“修复”事物,使用以下命令:

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

请注意,如果用户指定的函数阻止dplyr,该函数将报告,但为了安全起见,不会自动解决此问题(在这种情况下只需删除函数)。

到目前为止,这个解决方案并没有给我带来任何问题。当然我不主张在生产代码中使用它,但是当你调试.Rmd - 文件并且可能意外搞砸了加载顺序时,这是一个快速查找的方法。

如果你想在一个包装中使用它:

devtools::install_github("rubenarslan/formr")

答案 2 :(得分:6)

如果您先加载 MASS库,第二 dplyr一个

library (MASS)
library (dplyr)

然后会话selectsearchpaths ()函数的第一个版本将成为dplyr库中的第一个版本。

因此

select(mtcars, mpg)

将作为

dplyr::select(mtcars, mpg)

答案 3 :(得分:1)

就像上面KFB的评论一样,我发现一个简单的解决方案是(1)加载您的程序包,(2)不用担心顺序(依赖关系可能很难解决),(3)为任何一个分配优先级包,您希望“拥有”名称空间:

select <- dplyr::select
filter <- dplyr::filter

例如:

library(MASS)
select

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

select <- dplyr::select
select

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

答案 4 :(得分:0)

一个不错的解决方案是使用软件包conflicted,该软件包:

  • 在命名空间冲突发生时生成信息错误消息
  • 提供一个显式函数来分配名称空间优先级

请参见下面的示例代码,部分来自https://github.com/r-lib/conflicted

# install.packages("devtools")
devtools::install_github("r-lib/conflicted")

library(conflicted)
library(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")

# example of assigning priority with conflict_prefer function
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 :(得分:0)

尝试了许多替代方法之后,对我有用的是删除并重新安装MASS。