cnm
函数中实现了一种通用优化方法,并且应该使用它来创建自定义类的对象并为其实现特定方法。 我正在创建类的对象
npkm
:#' @export
npkm <- function(time, censor){
res <- list(time = time, censor = censor)
class(res) <- "npkm"
res
}
然后我需要实现我的班级的一种
gridpoints
方法(还有许多其他必需的方法):
#' @export
gridpoints.npkm = function(x, beta, grid=100) {
tms <- x$time
pp = unique(quantile(tms, seq(0, 1, len=grid), type = 1))
pp
}
函函数定义为
gridpoints
软件包的内部函数,如下所示:
nspmix
只要我的
gridpoints = function(x, beta, grid) UseMethod("gridpoints")
功能是源自且处于全球环境中,这可以完美地工作。但是我想创建一个使用此优化方法的软件包。一旦我将gridpoints.npkm
放入一个软件包,甚至导出它,每当我调用优化函数gridpoints.npkm
(在某个时候会调用
cnm
)时,我会发现一个错误,无法找到我的方法(没有适用于应用于类“ npkm”对象的'GridPoints'的方法)。一旦我将功能放入全球环境,而不是将其放置在软件包名称空间中,一切都很好。
我尝试从
gridpoints
软件包导入
UseMethod("gridpoints")
函数,但我不能,因为它没有导出。我尝试在我的软件包中添加相同的定义,但是
gridpoints
函数自然而然地调用它。文档的文档具有一些似乎相关的文本,也许可以解释为什么
nspmix
为什么没有在其他软件包中找到我的功能,但是我不太确定它作为解决方案的建议是什么:
namespaces可以注册通用功能的方法。为了支持这一点,在两个范围内,UseMethod和NextMethod搜索方法:在调用通用函数的环境中,以及在定义通用的环境的注册数据库中(通常是命名空间)。因此,需要在通用通用的环境中可用的通用功能的方法,或者必须注册它们。 (在定义通用的环境中是否可见并不重要。)从r 3.5.0开始,在呼叫环境的顶级环境(请参阅TopEnv)搜索注册数据库(但在顶级环境的父母之前)。
,我可以用来做这项工作的魔咒吗?也许声明nspmix::cnm
通用功能?还是需要在UseMethod
软件包中完成?
当写下我尝试过的所有内容时,我有了另一个想法,它奏效了:我必须明确声明我的函数是
UseMethod
通用函数的方法(即使它没有从名称空间导出)。
gridpoints
这个将添加到名称空间中。
nspmix