gpt4 book ai didi

包中的递归 S3 调用

转载 作者:行者123 更新时间:2023-12-01 03:18:08 25 4
gpt4 key购买 nike

我想要完成的

我有一个 R 包,其中包含一些以递归方式使用的内部 R 函数(在下面的示例中称为 f 和 g)。在最小的例子中,函数只返回其参数的长度,但在实际代码中,它们会触发更复杂的计算。

我想要做的是以下内容:

  • 如果用户将一个对象传递给函数 g,R 应该查找我们是否可以在该对象上调用 S3 方法。
  • 如果对象是一个列表,函数 g 应该应用于列表中的每个对象。如果我们还没有达到最大递归深度,则转到 1。如果我们达到了最大递归级别,则停止。

  • 显示问题的代码

    将以下代码放入包中很重要。我得到的错误只有在代码是包的一部分时才能重现。
    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 中的这个注释有关.如果您按照他们的建议使用包装器运行它,则调度会正确完成。

    g.list <- function(x, depth = 0) {
    sum(sapply(x, function(x_i) g(x_i, depth = depth + 1)))
    }

    enter image description here

    关于包中的递归 S3 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47698860/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com