科研星球

R代码冲突怎么排查?

培训时,同一段代码,大家都运行的好好的,而你却出现问题了,一般都是考虑包里的函数冲突了。这时需要一个个去排查到底是哪个函数发生了冲突,有没有更好的办法呢?

本文介绍一个包conflicted,可以列出所有冲突的函数,并可以设置优先使用哪个函数来处理冲突。

包的安装

install.packages("conflicted")
# 或
# install.packages("devtools")
# devtools::install_github("r-lib/conflicted")

加载包后,存在冲突的函数会无法运行

并且提供了两种解决方法,都在错误提示中。(学程序语言,看错误提示并且能理解错误提示很重要)

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

或者设定优先级

推荐在加载包的同时,就对可能会发生冲突的函数,设置使用优先级

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]



没有账号?