别人运行的好好的R代码,到我这怎么就冲突了?

共 2080字,需浏览 5分钟

 ·

2021-08-11 14:07

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

本文介绍一个包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]


往期精品(点击图片直达文字对应教程)

机器学习

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集


浏览 64
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报