Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 包中的递归S3调用 我想要完成的_R_Recursion_R Package_R S3 - Fatal编程技术网

R 包中的递归S3调用 我想要完成的

R 包中的递归S3调用 我想要完成的,r,recursion,r-package,r-s3,R,Recursion,R Package,R S3,我有一个R包,其中包含一些内部R函数(在下面的示例中称为f和g),它们以递归方式使用。在最小的示例中,函数只返回参数的长度,但在实际代码中,它们会触发更复杂的计算 我想做的是: 如果用户将一个对象传递给函数g,R应该查找是否有一个可以调用该对象的S3方法 如果对象是列表,则函数g应应用于列表中的每个对象。如果我们还没有达到最大递归深度,请转到1。如果达到最大递归级别,则停止 显示问题的代码 将以下代码放入包中非常重要。只有当代码是包的一部分时,我得到的错误才是可复制的。 utils.R g &l

我有一个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))
    }
    
    我所期望的 错误 结果应为6

    x <- c(1.0, 1.3, 1.5)
    core_fun(list(x,x))
    
    通行证 结果应该是3

    x <- c(1.0, 1.3, 1.5)
    core_fun(x)
    

    x我认为这与
    ?lappy
    中的注释有关。如果您像他们建议的那样使用包装器运行它,那么分派就正确完成了

    g.list
    
    Error in UseMethod("g") : 
    no applicable method for 'g' applied to an object of class "c('double','numeric')"  
    
    x <- c(1.0, 1.3, 1.5)
    core_fun(x)