我想要完成的
我有一个 R 包,其中包含一些以递归方式使用的内部 R 函数(在下面的示例中称为 f 和 g)。在最小的例子中,函数只返回其参数的长度,但在实际代码中,它们会触发更复杂的计算。
我想要做的是以下内容:
显示问题的代码
将以下代码放入包中很重要。我得到的错误只有在代码是包的一部分时才能重现。
utils.R
g <- function(x, depth = 0) {
stopifnot(depth <= 1)
UseMethod("g")
}
g.numeric <- function(x, depth = 0) {
length(x)
}
g.integer <- function(x, depth = 0) {
length(x)
}
g.double <- function(x, depth = 0) {
length(x)
}
g.list <- function(x, depth = 0) {
sum(sapply(x, g, depth = depth + 1))
}
core.R
#' @export
core_fun <- function(x) {
g(x)
}
我期待什么
错误
结果应该是6;
x <- c(1.0, 1.3, 1.5)
core_fun(list(x,x))
但我收到一条错误消息:
Error in UseMethod("g") :
no applicable method for 'g' applied to an object of class "c('double','numeric')"
通行证
结果应该是 3。
x <- c(1.0, 1.3, 1.5)
core_fun(x)
评论
当我调用这个例子时,失败了,在将函数 g 加载到全局命名空间后,我得到了预期的结果,6。
所以我认为这是一个与命名空间/S3 相关的问题,但我不知道如何解决它。
最佳答案
我相信这与 ?lapply
中的这个 Note 有关。如果您按照他们的建议使用包装器运行它,则调度会正确完成。
g.list <- function(x, depth = 0) {
sum(sapply(x, function(x_i) g(x_i, depth = depth + 1)))
}
关于包中的递归 S3 调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47698860/