R:2个不同包中的2个同名函数
Posted
技术标签:
【中文标题】R:2个不同包中的2个同名函数【英文标题】:R: 2 functions with the same name in 2 different packages 【发布时间】:2011-07-30 16:34:44 【问题描述】:我需要加载到 R 包:tseries 和 chron
两者都有一个名为 is.weekend 的函数
我的环境中总是有我加载的第二个包中的函数。
我怎样才能始终从 chron 访问该功能?
【问题讨论】:
见how-does-r-handle-overlapping-object-names 【参考方案1】:您可能已经注意到,加载包的顺序会有所不同,即最后加载的包将掩盖之前加载的包中的功能。
要指定要使用的包,语法是:
chron::is.weekend()
tseries::is.weekend()
换句话说,使用packagename::functionname()
另外,如果你知道你会一直想使用chron中的函数,你可以定义自己的函数如下:
is.weekend <- chron::is.weekend #EDIT
【讨论】:
is.weekend<-chron::is.weekend
就够了。
此处不相关,因此仅供此线程中的未来参考:如果函数未导出(即您想要特定的 S3 方法并且该方法未导出但generic is) 那么:::
操作符是必需的。
@Gavin 没错,但我总是非常谨慎地提及未导出的函数。大概包作者没有导出它是有原因的,并且可以在没有警告的情况下更改功能。为了保护依赖于此类函数的代码,最好说服包作者导出此函数,或者获得在您自己的代码中重用的权限。
我完全同意包中的生产代码。对于个人使用,只要存档包源的确切版本并记录数据分析代码中使用的包版本的详细信息,我就不会看到问题。当然,这适用于所有包代码的使用,因为你是在包开发人员的心血来潮改变事情,所有代码可能包含一些错误......在我看来,关键问题是可重复性,其余的我们必须接受并接受,但至少有一个可以查看代码并检查它是否适用于 R 和(大多数)R 包。
@LauriK 使用 base::`%in%`
或 `%in%` <- base::`%in%`
【参考方案2】:
library(chron)
is.weekend.chron <- is.weekend
library(tseries)
那么你可以为 tseries 版本调用 is.weekend 或为 chron 版本调用 is.weekend.chron
【讨论】:
【参考方案3】:您应该使用 Hadly 的 conflicted
包。
library(conflicted)
library(dplyr)
filter(mtcars, am & cyl == 8)
那么冲突包会抛出错误,并强制你清楚地确定你喜欢哪个函数:
错误:在 2 个包中找到过滤器。你必须用 :: 指明你想要哪一个 * dplyr::过滤器 * 统计::过滤器
要解决整个会话的冲突,请使用<-
:
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/
【讨论】:
【参考方案4】:我有 2 个具有相同函数名 ts() 的包 有相同的两个包是:
-
预测
列表项
我通过键入检查了发生的情况
?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函数 我用过:因为帮助告诉我预测正在调用统计数据
时间序列对象(在包统计中
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")
【讨论】:
以上是关于R:2个不同包中的2个同名函数的主要内容,如果未能解决你的问题,请参考以下文章
处理 R 中冲突的命名空间(不同包中的相同函数名):重置包命名空间的优先级
在 2 个不同的 div ID 中有 2 个同名的 HTML 下拉列表,那么如何使用 AJAX/jQuery 提交特定 div ID 的下拉值
R语言leaps包中的regsubsets函数实现全集子集回归(all subsets regression)使用调整R方和Mallows Cp统计量筛选最优模型并可视化不同组合参数下的模型指标