如何正确处理R包中的掩码冲突?

时间:2014-10-20 09:57:19

标签: r conflict

我想知道如果冲突的包不是我自己的包,那么处理掩码的最佳方法是正确的。请考虑以下示例。我和时间系列一起工作很多 并且通常使用季度,年等功能名称。因此,如果我加载tisdata.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不再有效。我是否需要分叉包并实现一些::语法?这个例子可能是具体的,但问题很普遍。更有经验的用户会做些什么?

编辑:可能我需要更清楚地说明这一点。问题是我没有机会明确地调用该函数,因为TSget正在调用应该被明确调用的函数,并假设只有tis。

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”

1 个答案:

答案 0 :(得分:1)

调用堆栈显示year调用模糊命名的函数getfamegetAnywhere("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"
)