如果我加载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::select的MASS包?
r.b*_*bot 66
正如Pascal所说,以下是有效的
require(MASS)
require(dplyr)
mtcars %>%
dplyr::select(mpg)
Run Code Online (Sandbox Code Playgroud)
Rub*_*ben 19
这比我应该承认的更频繁地发生在我身上.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)
Run Code Online (Sandbox Code Playgroud)
请注意,如果用户指定的函数阻止dplyr,该函数将报告,但为了安全起见,不会自动修复此函数(在这种情况下只删除函数).
到目前为止,这个解决方案并没有给我带来任何问题.当然我不会主张在生产代码中使用它,但是当你调试一个.Rmd-file并且可能意外地搞砸了加载顺序时,这是一个快速查找的方法.
如果你想在一个包中:
devtools::install_github("rubenarslan/formr")
Run Code Online (Sandbox Code Playgroud)
如果加载第一的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)
此处列出的其他解决方案可能会解决您的直接问题,但会以严重的方式失败:它们无法提前告诉您未知的冲突。例如,我刚刚更新了一些旧代码并发现我使用的三个包每个都有一个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)
就像上面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)
| 归档时间: |
|
| 查看次数: |
41476 次 |
| 最近记录: |