如何声明基本S3功能,以便它也可以在其他包中使用?

时间:2015-01-22 19:39:21

标签: r

在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, ...)
#'}

也许这会起作用

0 个答案:

没有答案