在加载了几包上班了一些数据,我当我试图用函数收到一个错误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)
不过我想知道:
除了加载包时的“以下对象被屏蔽”消息之外,是否有诊断同名函数问题的最佳实践?
我的方法是dplyr::select(解决这些冲突的最佳方法吗?
最终,我当前的策略是加载具有select()我将使用更多功能的包,然后加载具有较少使用版本的包。
这里有一些可以做的事情。
在发出library声明时,R 将列出所有冲突。注意这些!如果您以后需要知道冲突,请输入:conflicts()。
使用(R 3.6 及更高版本)exclude上的参数library。例如library(MASS, exclude = "select")。dplyr clobbers 基础lag,filter因此您可能希望养成定期排除那些的习惯:library(dplyr, exclude = c("filter", "lag")) 仍然可以使用dplyr::lag等访问它们。
dplyr::select如果您发现它已被屏蔽,请使用符号。
detach您不再使用的任何软件包,例如detach("package:MASS").
在某些情况下,屏蔽是良性的,因为新版本向后兼容,并且在这些情况下无需避免冲突。
正如@LenGreski 在评论中所指出的,包顺序将决定任何冲突的解决方案。如果发生冲突,每个包都会覆盖在它之前加载的所有先前包。
还有许多包可以解决冲突问题,包括冲突(@MrFlick 提到)、模块和导入,它们都在 CRAN 上,第二个包也称为模块不在 CRAN 上。
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |