我正在尝试在首次加载软件包时初始化并存储一些特定于软件包的信息,并在How to store some package specific information in R和How to run some code on load of package中找到了很多关于如何执行此操作的良好信息。但是,我想在程序包加载期间调用的一个函数验证程序包中定义的几个类的继承关系,但这会返回与我预期的不同的结果。我可以提出不同的方法来解决这个问题,但我正在努力理解我做错了什么,并希望有人可以向我解释。
重现问题的软件包源代码的最小示例如下。
# package reference classes
setClass("myclass", representation(value = "numeric"),
prototype = prototype(value = 42))
setClass("myderivedclass", contains = "myclass")
# package on load function
.onLoad <- function(lib, pkg){
if (!extends("myderivedclass", "myclass")) {
warning("something's not right")
}
}
现在在包.onLoad
期间,extends("myderivedclass", "myclass")
评估为FALSE
(触发警告),但当然加载包后它会评估为TRUE
,这是什么我原以为是。在.onLoad
期间使用任一类初始化对象的工作正常,因此不会加载类定义。
非常感谢您在.onLoad
期间我应该如何进行此类测试或者我可能在这里误解了继承的任何帮助。
会话信息:
> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
答案 0 :(得分:0)
为了完整起见,这就是setLoadAction
代替.onLoad
setLoadActions(function(ns) {
if (!extends("myderivedclass", "myclass")) {
warning("something's not right")
} else {
message("everything all right")
}
})
通过这种方式,extends("myderivedclass", "myclass")
在程序包加载期间正确评估为TRUE
。