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

luc*_*ano 60 r dplyr

如果我加载MASS包:

library(MASS)
Run Code Online (Sandbox Code Playgroud)

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

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

# Error in select(`__prev`, mpg) : unused argument (mpg)
Run Code Online (Sandbox Code Playgroud)

如何使用加载dplyr::selectMASS包?

r.b*_*bot 66

正如Pascal所说,以下是有效的

require(MASS)
require(dplyr)
mtcars %>%
   dplyr::select(mpg)
Run Code Online (Sandbox Code Playgroud)

  • 如果你确定你要经常加载MASS和dplyr并且经常使用'select',你可以重新分配函数:select < - dplyr :: select这可以帮助保存重复输入'dplyr ::' (27认同)
  • 我知道这已经过时了但无论如何.刚遇到同样的问题.显然MASS是由ggplot2导入的(其中包括),所以我猜很多人可能会一起使用它们.虽然我相信我之前一直在使用ggplot2和dplyr而没有问题...... (2认同)

Rub*_*ben 19

这比我应该承认的更频繁地发生在我身上.dplyr与冲突MASS::select,plyr::summarise以及stats::filter除其他事项外,尤其是当装载包,其载荷通过图书馆的图书馆之一(他们不应该,但仍有部分做的),或者当您在加载dplyr .Rprofile(不!).它可能导致相当模糊的问题,并不总是错误信息,特别是与之冲突plyr.

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

所以我写了一个函数来告诉我,我是否生气,或者实际上是否存在导致当前错误的冲突.它不仅检查冲突,还检查某个所需的包是否是"顶部"以及该功能的实体是否实际不同.

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

用法很简单:amigoingmad().

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

detach("package:dplyr", character.only = TRUE)
library("dplyr", character.only = TRUE)
Run Code Online (Sandbox Code Playgroud)

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

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

如果你想在一个包中:

devtools::install_github("rubenarslan/formr")
Run Code Online (Sandbox Code Playgroud)

  • 美丽的。我以为我要疯了。 (2认同)

dmo*_*ner 8

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

library (MASS)
library (dplyr)
Run Code Online (Sandbox Code Playgroud)

然后select会话searchpaths ()中的第一个函数版本将是dplyr库中的函数.

于是

select(mtcars, mpg)
Run Code Online (Sandbox Code Playgroud)

将作为

dplyr::select(mtcars, mpg)
Run Code Online (Sandbox Code Playgroud)


Oma*_*sow 6

此处列出的其他解决方案可能会解决您的直接问题,但会以严重的方式失败:它们无法提前告诉您未知的冲突。例如,我刚刚更新了一些旧代码并发现我使用的三个包每个都有一个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")
Run Code Online (Sandbox Code Playgroud)

下面是一个示例,就好像您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")
Run Code Online (Sandbox Code Playgroud)

下面是一个带有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
Run Code Online (Sandbox Code Playgroud)


Oma*_*sow 5

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

select <- dplyr::select
filter <- dplyr::filter
Run Code Online (Sandbox Code Playgroud)

例如,查看environment: namespace下面的更改:

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>
Run Code Online (Sandbox Code Playgroud)