R:2个函数在2个不同的包中具有相同的名称

Roc*_*nce 59 conflict packages r function

我需要加载到R包:tseries和chron

两者都有一个名为is.weekend的函数

我总是在我的环境中使用我加载的第二个包中的函数.

我怎样才能从chron那里随时访问这个函数?

And*_*rie 81

您可能已经注意到加载包的顺序有所不同,即最后加载的包将掩盖先前加载的包中的函数.

要指定要使用的包,语法为:

chron::is.weekend()
tseries::is.weekend()
Run Code Online (Sandbox Code Playgroud)

换句话说,使用 packagename::functionname()

此外,如果您知道您将始终想要使用chron中的函数,则可以按如下方式定义自己的函数:

is.weekend <- chron::is.weekend    #EDIT
Run Code Online (Sandbox Code Playgroud)

  • `is.weekend <-chron :: is.weekend`就足够了. (4认同)
  • 这里不相关,所以只是为了将来在这个线程中的引用:如果函数是*not*导出(即你想要一个特定的S3方法并且方法没有导出但是泛型是)那么需要`:::`运算符. (3认同)
  • @Gavin这是正确的,但我总是非常谨慎地引用一个未导出的函数.据推测,包装作者没有出于某种原因导出它,并且可能在没有警告的情况下更改功能.要保护依赖于此类函数的代码,最好是说服程序包作者导出此函数,或者获取在您自己的代码中重用的权限. (3认同)
  • @LauriK在%\`中使用`base :: \`%或在%\`中使用`\`%`` - 在%\`中使用`%:: \`% (3认同)

小智 6

你应该转向conflicted哈德利的包裹。

library(conflicted)
library(dplyr)
filter(mtcars, am & cyl == 8)
Run Code Online (Sandbox Code Playgroud)

然后冲突的包将抛出错误,并迫使您明确确定您更喜欢哪个功能:

错误:在 2 个包中发现过滤器。您必须使用 :: * dplyr::filter * stats::filter 指明您想要哪一个

要解决整个会话的冲突,请使用<-

filter <- dplyr::filter
filter(mtcars, am & cyl == 8)
Run Code Online (Sandbox Code Playgroud)
    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
Run Code Online (Sandbox Code Playgroud)

您还可以使用conflict_prefer()在发生冲突时确定获胜者的功能。代码示例借自Hadly,请参考包网站。 https://www.tidyverse.org/blog/2018/06/conflicted/


jbe*_*erg 5

library(chron)
is.weekend.chron <- is.weekend
library(tseries)
Run Code Online (Sandbox Code Playgroud)

那么你可以为 tseries 版本调用 is.weekend 或为 chron 版本调用 is.weekend.chron