【问题标题】:dplyr::select function clashes with MASS::selectdplyr::select 函数与 MASS::select 冲突
【发布时间】:2014-08-03 19:47:00
【问题描述】:

如果我加载 MASS 包:

library(MASS)

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

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

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

如何在加载了MASS 包的情况下使用dplyr::select?

【问题讨论】:

  • 你可以像刚才写的那样使用它:dplyr::select(mpg)
  • 截至今天 03.12.2019,五年后仍未解决,我只是遇到了完全相同的问题。

标签: r dplyr


【解决方案1】:

正如帕斯卡所说,以下工作

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

【讨论】:

  • 如果您确定要经常一起加载 MASS 和 dplyr 并经常使用“选择”,您可以重新分配该功能:选择
  • 我知道这是旧的,但无论如何。刚遇到同样的问题。显然 MASS 是由 ggplot2 导入的(除其他外),所以我猜很多人可能会一起使用它们。虽然我相信我之前一直在使用 ggplot2 和 dplyr 没有问题......
  • 我也有类似的问题。然而,奇怪的是直到今天才出现这个问题,而且我并没有真正改变我的代码。我只将导致错误的部分插入if(x == x) { ... } 条件。任何想法为什么突然出现这个错误,以前没有问题?
  • @deca,我不知道,你可能想把它作为一个单独的问题来问。
  • 也与包drc冲突解决方法是使用dplyr:select,如上所述
【解决方案2】:

这种情况发生在我身上的频率比我应该承认的要频繁。 dplyr 与 MASS::select、plyr::summarise 和 stats::filter 发生冲突,尤其是在加载通过库加载其中一个库的包时(它们不应该,但有些仍然这样做)或者当你在 @987654325 中加载 dplyr 时@ (别!)。而且它可能会导致非常模糊的问题,并不总是错误消息,尤其是与 plyr 冲突。

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

所以我写了a function 告诉我我是不是要发疯了,或者是否真的存在导致当前错误的冲突。它不仅检查冲突,还检查某个所需的包是否是“最上面”的包以及函数的主体是否实际不同。

默认情况下它为 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")

【讨论】:

  • 美丽。我以为我要疯了。
【解决方案3】:

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

library (MASS)
library (dplyr)

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

因此

select(mtcars, mpg)

将作为

dplyr::select(mtcars, mpg)

【讨论】:

  • +1 提示searchpaths() 进行自检。我发现library(tidyverse) 在 dplyr 之前加载 MASS - 这会导致频繁的错误!所以解决方法是在 tidyverse 之前显式加载 MASS,例如 library(MASS); library (tidyverse)
【解决方案4】:

与上面 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
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-11
        • 2018-02-08
        • 2015-03-22
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多