解决 R 中函数名冲突的最佳方法是什么?

Pak*_*ake 4 r

在加载了几包上班了一些数据,我当我试图用函数收到一个错误select()dplyr包。我试图使用一个新包(对我来说)MASS,所以我很容易能够诊断并让事情正常工作。然而,这种经历让我很好奇,在一个包含多个包、功能相互冲突的世界中,最佳工作方式是什么。

考虑以下代码和错误消息:

library(dplyr)
library(MASS)


df<-data.frame(Lobsters=c(1,3,4,5,7,1),Llamas=c(7,1,2,5,8,3))

df2<-df%>%
  select(Lobsters)
Run Code Online (Sandbox Code Playgroud)

select(.,Lobsters) 中的错误:未使用的参数(龙虾)

虽然这个错误清楚地表明 select() 给了我这个问题,但它并不一定让我清楚问题是我没有调用select()我习惯的函数。

我知道我可以调用该dplyr函数并使用以下方法获得我想要的结果:

df2_alt<-df%>%
  dplyr::select(Lobsters)
Run Code Online (Sandbox Code Playgroud)

不过我想知道:

  1. 除了加载包时的“以下对象被屏蔽”消息之外,是否有诊断同名函数问题的最佳实践?

  2. 我的方法是dplyr::select(解决这些冲突的最佳方法吗?

最终,我当前的策略是加载具有select()我将使用更多功能的包,然后加载具有较少使用版本的包。

G. *_*eck 7

这里有一些可以做的事情。

  1. 在发出library声明时,R 将列出所有冲突。注意这些!如果您以后需要知道冲突,请输入:conflicts()

  2. 使用(R 3.6 及更高版本)exclude上的参数library。例如library(MASS, exclude = "select")。dplyr clobbers 基础lagfilter因此您可能希望养成定期排除那些的习惯:library(dplyr, exclude = c("filter", "lag")) 仍然可以使用dplyr::lag等访问它们。

  3. dplyr::select如果您发现它已被屏蔽,请使用符号。

  4. detach您不再使用的任何软件包,例如detach("package:MASS").

  5. 在某些情况下,屏蔽是良性的,因为新版本向后兼容,并且在这些情况下无需避免冲突。

  6. 正如@LenGreski 在评论中所指出的,包顺序将决定任何冲突的解决方案。如果发生冲突,每个包都会覆盖在它之前加载的所有先前包。

还有许多包可以解决冲突问题,包括冲突(@MrFlick 提到)、模块导入,它们都在 CRAN 上,第二个包也称为模块不在 CRAN 上。

  • 需要考虑添加到列表中的一项是包裹装载顺序。如果不需要`MASS::select()`,可以在`dplyr`之前加载`MASS`,然后使用`dplyr`版本的`select()`。 (2认同)