在R中,我希望声明一个新的S3类,然后在两个包中定义它的方法。
目前,这适用于一个软件包,但是第二个软件包加载了第一个软件包,然后找不到软件包一的类方法(它最终会调用.default方法。
询问奉献者谷歌列表,并从Hadley获得工作解决方案创建第三个包,在那里声明基类,然后在两个真正的包中导入和导出该命名空间。但我真的不想使用第三个包...
有什么建议吗? (这不是全部使用devtools构建的,它根据函数名称中的。来适当地处理S3对象)
对于那些不熟悉S3的人,你声明一个默认的处理程序,类处理程序和一个存根函数,它表明存在一个类处理程序,如果没有,则调用默认的处理程序。
因此,在package1中,我定义并导出了一个基类,一些有用的处理程序和一个默认值。
#' @export
#' myFun <- function(x, ...){
#' UseMethod("myFun", x)
#' }
#' @export
#' myFun.x1 <- function(x, ...){
#' message("hi, I handled an x1 object from package 1")
#' }
#' @export
#' myFun.default <- function(x,...){
#' print("myFun is not defined")
#'}
在包2中,我希望只定义和导出一些额外的对象处理程序
#' @export
#' myFun.x2 <- function(x, ...){
#' message("hi, I handled an x2 object from package 2")
#' }
第二个包取决于包1中的几个fns,因此在描述文件中我depend:
Depends:
packageOne
仅供参考,如果我导入 packageOne,我会收到错误消息 错误:加载命名空间'packageTwo'
时找不到对象'myFun'取决于package1确保它在加载package2时加载并可用,但R的解析链似乎只能查看最后一个包加载到处理程序。使用包1中的处理程序为对象调用S3函数可以正常工作。但是如果在package2中定义了处理程序,则查找表无法在包2中找到处理程序,并在包1中调用默认值。
我想我可以在包2中编写一个myFun.defaul
处理程序,该处理程序显式调用package1的myFun版本。建议欢迎
#' @export
#' myFun.default <- function(x,...){
#' package1::myfun(x, ...)
#'}
也许这会起作用