如果我加载MASS
包:
library(MASS)
然后加载尝试运行dplyr::select
,我收到错误:
library(dplyr)
mtcars %.%
select(mpg)
# Error in select(`__prev`, mpg) : unused argument (mpg)
如何在加载dplyr::select
包时使用MASS
?
答案 0 :(得分:60)
正如Pascal所说,以下作品
require(MASS)
require(dplyr)
mtcars %>%
dplyr::select(mpg)
答案 1 :(得分:19)
这种情况比我应该承认的更频繁。 dplyr与MASS::select
,plyr::summarise
和stats::filter
冲突,特别是在加载通过库加载其中一个库的软件包时(它们不应该,但有些仍然可以)或者当你加载时在你的.Rprofile
中加载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
- 文件并且可能意外搞砸了加载顺序时,这是一个快速查找的方法。
如果你想在一个包装中使用它:
devtools::install_github("rubenarslan/formr")
答案 2 :(得分:6)
如果您先加载 MASS
库,第二 dplyr
一个
library (MASS)
library (dplyr)
然后会话select
中searchpaths ()
函数的第一个版本将成为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。