如果我加载MASS
包裹:
library(MASS)
然后加载尝试运行dplyr::select
,我得到一个错误:
library(dplyr)
mtcars %.%
select(mpg)
# Error in select(`__prev`, mpg) : unused argument (mpg)
如何使用dplyr::select
已MASS
加载的软件包?
Answers:
正如Pascal所说,以下作品
require(MASS)
require(dplyr)
mtcars %>%
dplyr::select(mpg)
if(x == x) { ... }
条件中。为什么突然出现此错误,以前没有问题的任何想法?
这件事在我身上的发生频率比我应该承认的高。dplyr上有冲突MASS::select
,plyr::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")
如果加载第一的MASS
图书馆和第二的dplyr
一个
library (MASS)
library (dplyr)
那么select
您会话中该函数的第一个版本searchpaths ()
将是dplyr
库中的那个版本。
因此
select(mtcars, mpg)
将作为
dplyr::select(mtcars, mpg)
searchpaths()
进行自我检查。我发现library(tidyverse)
在dplyr之前加载了MASS-这会导致频繁的错误!因此,解决方法是在tidyverse之前显式加载MASS,例如library(MASS); library (tidyverse)
就像上面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() <---------
此处列出的其他解决方案可能会解决您的迫在眉睫的问题,但会以严重的方式失败:它们无法告诉您事先未知的冲突。例如,我刚刚更新了一些旧代码,发现我正在使用的三个软件包都有一个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
dplyr::select(mpg)