我想知道如果冲突的包不是我自己的包,那么处理掩码的最佳方法是正确的。请考虑以下示例。我和时间系列一起工作很多
并且通常使用季度,年等功能名称。因此,如果我加载tis
和data.table
,R的功能显然取决于加载包的顺序。
library(tis)
library(data.table)
# this masks: between, month, quarter, year
library(TSfame) # loads TSdbi
con <- TSconnect("somefame.db")
# the following fails when data.table was loaded after tis
ts1 <- TSget("somekeyInYourDB",con)
来自TSdbi
包的和TSget不再有效。我是否需要分叉包并实现一些::
语法?这个例子可能是具体的,但问题很普遍。更有经验的用户会做些什么?
EDIT2,根据Richie Cotton的要求添加调用堆栈:
Tracing year(actualStart) on entry
[[1]]
TSget("kofbauindikator_total", con)
[[2]]
TSget("kofbauindikator_total", con)
[[3]]
.local(serIDs, con, ...)
[[4]]
getfame(serIDs[i], dbname[i], save = FALSE, envir = parent.frame(),
start = NULL, end = NULL, getDoc = FALSE)
[[5]]
year(actualStart)
[[6]]
.doTrace((function ()
print(sys.calls()))(), "on entry")
[[7]]
eval.parent(exprObj)
[[8]]
eval(expr, p)
[[9]]
eval(expr, envir, enclos)
[[10]]
(function ()
print(sys.calls()))()
Error in as.POSIXlt.default(x) :
do not know how to convert 'x' to class “POSIXlt”
答案 0 :(得分:1)
调用堆栈显示year
调用模糊命名的函数getfame
。 getAnywhere("getfame")
显示这可以在fame
包中找到。
packageDescription("fame")
表明fame
取决于tis
而不是导入它,这就是问题所在。正如here所告知的那样,通过电子邮件发送软件包维护者(Jeff Hallman)来请求他将依赖项更改为导入是一个好主意。这可能需要一些包重新编写,因此您也可以建议更改行
startYear <- as.integer(year(actualStart))
在getfame
到
startYear <- as.integer(tis::year(actualStart))
(可能还有其他必要的变化。)
当您等待维护者的修复时,您可以使用assignInNamespace
覆盖该函数。也就是说,在加载包之前,请键入
assignInNamespace(
"getfame",
function(sernames, db, connection = NULL, save = FALSE, envir = parent.frame(),
start = NULL, end = NULL, getDoc = TRUE)
{
# your fixed function definition with tis::year
},
"fame"
)