R:2个不同包中的2个同名函数


Answers:


100

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

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

chron::is.weekend()
tseries::is.weekend()

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

另外,如果您知道总是要在chron中使用该函数,则可以如下定义自己的函数:

is.weekend <- chron::is.weekend    #EDIT

4
is.weekend<-chron::is.weekend足够的。
mbq 2011年

4
此处不相关,因此仅供该线程将来参考:如果导出函数(即,您想要特定的S3方法,并且未导出该方法,但泛型是),则:::需要该运算符。
加文·辛普森

3
@Gavin没错,但是对于引用未导出的函数我总是非常谨慎。可能是程序包作者由于某种原因未导出它,并且可以更改功能而不会发出警告。为了保护依赖于此功能类型的代码,最好说服程序包作者导出此功能,或者获得在自己的代码中重用的许可。
Andrie

1
我完全同意打包中的生产代码。对于个人用途,只要一个人将软件包源的确切版本存档并记录数据分析代码中使用哪个版本的软件包的详细信息,我就不会看到这些问题。当然,这适用于所有使用程序包代码,因为程序包开发人员会根据自己的想法进行更改,并且所有代码都可能包含一些错误...关键问题是我认为可重复性,其余的我们必须接受并与之兼容,但是至少有一个人可以看到该代码,并检查它是否与R和(大多数)R包一起使用。
加文·辛普森

3
@LauriK使用base::`%in%``%in%` <- base::`%in%`
Andrie

5
library(chron)
is.weekend.chron <- is.weekend
library(tseries)

那么您可以调用tseries版本的is.weekend或chron版本的is.weekend.chron


2

您应该转向conflictedHadly的包裹。

library(conflicted)
library(dplyr)
filter(mtcars, am & cyl == 8)

然后,有冲突的程序包将引发错误,并迫使您清楚地确定要使用的功能:

错误:在2个程序包中找到了过滤器。您必须使用:: * dplyr :: filter * stats :: filter指明要使用哪一个

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

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

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


0

我有2个具有相同功能名称ts()的软件包。2个具有相同功能的包装是:

  1. 预测
  2. 项目清单

我通过键入检查了发生了什么

?ts


Help on topic 'ts' was found in the following packages:

Time-Series Objects
(in package stats in library C:/Program Files/R/R-3.6.2/library)
Format time stamps
(in package bReeze in library C:/Users/mycomputer/Documents/R/win-library/3.6)

解决方案:然后使用我使用的软件包预测所附带的功能ts:因为帮助显示了forcast正在调用统计信息

时间序列对象(在软件包统计信息中)

stats::ts

因为可以从帮助中看到预测使用了称为stats的程序包;)

forecast::ts

Time-Series Objects
(in package stats

给我错误,因为预报包使用子包;

因此最终用法如下所示:

library(bReeze)
library(forecast)

# Subset data
my_time_series <- stats::ts(c(df_sub$y), start=2018, frequency = 12)

# Plot
theme_set(theme_classic())
ggseasonplot(my_time_series) + labs(title="My graph title")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.