函数冲突报错就完了吗

一个星期前我指出来了R语言包开发的一个现象:R语言的繁荣背后何尝没有隐患,很多函数名字被多个R包使用,这样就出现了冲突,所以我们需要显示调用具体的某个R包的某个函数。

恰好被隔壁Y叔看到了,所以立马给出来了解决方案,在听说你用的函数又撞名了? 可以看到conflicted包超级好用,专门盯着你,让你报错!

可是,绝大部分人并不是R包开发者,我们不需要报错,我们需要的是解决方案.

比如,我在使用如下函数的时候,报错:

> showDatabaseCategory(CellChatDB)
Error: Problem with `summarise()` input `value`.
x could not find function "n"
ℹ Input `value` is `n()`.
ℹ The error occurred in group 1: annotation = "Cell-Cell Contact".
Run `rlang::last_error()` to see where the error occurred.

其实是因为这个函数本身里面封装了很多其它函数,但是作为用户我们并没有能力去修改这个函数本身。conflicted包也没有用,我们需要的是解决方案!

所以我使用代码 ?summarise 查询了一下这个出现冲突了的函数是什么情况:

Summarise a data frame.
(in package plyr in library /Library/Frameworks/R.framework/Versions/4.0/Resources/library)
Objects exported from other packages
(in package plotly in library /Library/Frameworks/R.framework/Versions/4.0/Resources/library)
Summarise each group to fewer rows
(in package dplyr in library /Library/Frameworks/R.framework/Versions/4.0/Resources/library)

果然,绝大部分情况下,这个 summarise函数应该是来自于dplyr包,但是它的排名很靠后。但是我使用的是showDatabaseCategory函数,它里面封装的summarise函数我是无权修改的,我没办法跟之前:R语言的繁荣背后何尝没有隐患,那样通过指定某个R包的某个函数的方法来解决报错。

所以我使用代码 library(dplyr) 重新加载了一下 dplyr包,提升了它的优先级。

这样代码就不会报错啦。

机智如我!

Comments are closed.