参见:https://mp.weixin.qq.com/s/oxElKitqQjwtD8HkpKk_JQ

虽然说世界上没有两片相同的叶子,但却有几万个张伟,无数个小明。

R 包也一样,有时候明明我需要用的是xx 包的xx 函数,却被R 误当作aa 包的xx 函数。虽然它们都叫做xx 函数,但功能却是大相径庭。

R告诉你 你错了

我们如何避免这样的问题呢。其实作为R 包的开发者来说,最好还是显式调用:

  1. > tidyr::tibble(mat)

但有的时候,这样做也比较麻烦。要是R 可以帮我们区分,环境中是否发生冲突就好了。即如果环境中有两个函数名相同,就告诉我们要显式调用。

conflicted 便可以解决它:

  1. > library(stats)
  2. > library(tidyverse)
  3. > filter
  4. Error: [conflicted] `filter` found in 2 packages.
  5. Either pick the one you want with `::`
  6. * dplyr::filter
  7. * stats::filter
  8. Or declare a preference with `conflict_prefer()`
  9. * conflict_prefer("filter", "dplyr")
  10. * conflict_prefer("filter", "stats")
  11. Run `rlang::last_error()` to see where the error occurred.

我们可以参照:

01. 自定义R 的启动环境

将conflicted 包加载在启动配置中。

你告诉R 他错了

参见:https://mp.weixin.qq.com/s/l90spoS_YQ-6AFcLiqEp0g

虽然我们自己在直接使用函数的时候,用conflicted 是个不错的习惯,并且尽量的使用显式调用。

可是在你的环境中不冲突的函数,未必在别人的环境不冲突呀。

而且,有得人开发的R 包使用的函数,很有可能跟你使用的其他函数撞名,直接去修改别人包中函数的源代码,成本就太大了:

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

这时候我们可以先看看环境中哪些包有该撞名的函数:

  1. ?summarise
  2. Summarise a data frame.
  3. (in package plyr in library /Library/Frameworks/R.framework/Versions/4.0/Resources/library)
  4. Objects exported from other packages
  5. (in package plotly in library /Library/Frameworks/R.framework/Versions/4.0/Resources/library)
  6. Summarise each group to fewer rows
  7. (in package dplyr in library /Library/Frameworks/R.framework/Versions/4.0/Resources/library)

这个时候加载的顺序也就是函数在环境中的优先级,可见dplyr 所在的位置优先级靠后,因此在使用函数时,R 首先认为是plyr 这个包中的函数。

这个时候直接重新加载一下dplyr 包,优先级就上来了。报错也就轻松解决了。