培训时,同一段代码,大家都运行的好好的,而你却出现问题了,一般都是考虑包里的函数冲突了。这时需要一个个去排查到底是哪个函数发生了冲突,有没有更好的办法呢?
本文介绍一个包conflicted
,可以列出所有冲突的函数,并可以设置优先使用哪个函数来处理冲突。
包的安装
代码语言:javascript复制install.packages("conflicted")
# 或
# install.packages("devtools")
# devtools::install_github("r-lib/conflicted")
加载包后,存在冲突的函数会无法运行
并且提供了两种解决方法,都在错误提示中。(学程序语言,看错误提示并且能理解错误提示很重要)
代码语言:javascript复制library(conflicted)
library(dplyr)
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")
使用::
指定使用哪个包的哪个函数
如下,虽然写的字母多了些,但清晰明了。如果只用到了filter
函数,dyplr
包都不用显示加载。
另外,在Rstuido中,还会有函数自动补全功能,输入dplyr::
后会列出这个包里面所有外部可用函数。
相对应的还有dplyr:::
可以调用dplyr
中没有export
出的函数。
dplyr::filter(mtcars, am & cyl == 8)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> 1 15.8 8 351 264 4.22 3.17 14.5 0 1 5 4
#> 2 15.0 8 301 335 3.54 3.57 14.6 0 1 5 8
或者设定优先级
推荐在加载包的同时,就对可能会发生冲突的函数,设置使用优先级
代码语言:javascript复制library(dplyr)
# 优先使用dplyr里面的filter函数
conflict_prefer("filter", "dplyr")
#> [conflicted] Will prefer dplyr::filter over any other package
filter(mtcars, am & cyl == 8)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> 1 15.8 8 351 264 4.22 3.17 14.5 0 1 5 4
#> 2 15.0 8 301 335 3.54 3.57 14.6 0 1 5 8
列出所有存在冲突的函数
如果函数后面存在[]
,则表示根据默认优先级或认为设定的优先级采用对应包里的函数。
如果函数后面没有[]
,如lag
函数,使用时就需要按上面2种方式的一种设置具体调用或优先调用哪个包里的lag
函数。
conflict_scout()
#> 6 conflicts:
#> * `filter` : [dplyr]
#> * `intersect`: [dplyr]
#> * `lag` : dplyr, stats
#> * `setdiff` : [dplyr]
#> * `setequal` : [dplyr]
#> * `union` : [dplyr]