代码之家  ›  专栏  ›  技术社区  ›  Earlien

do.call将mgcv::gam作为字符串失败,但不会执行其他函数

  •  0
  • Earlien  · 技术社区  · 1 年前

    我正在尝试使用一个master函数作为主力来适应几个不同的模型(每个函数都用变量调用这个master函数 model 作为字符串和通过 ... )

    它适用于 model = "loess" model = "glm" ,但失败 model = "gam" 明确地 do.call(model, args) 将失败,除非我用名称空间硬编码函数名。但我需要 模型 成为一个变量。同样的问题也发生在 formalArgs 我过去常常得到 args .E.g(reprex)基于类似SO问题的建议:

    model <- "mgcv::gam"
    formalArgs(mgcv::gam)                   # Works but function is hard-coded
    formalArgs(gam)                         # Fails
    formalArgs(model)                       # Fails
    formalArgs(eval(model))                 # Fails
    formalArgs(substitute(model))           # Returns NULL with warning
    formalArgs(deparse(substitute(model)))  # Fails
    

    错误消息为 Error in get(fun, mode = "function", envir = envir) : object '"mgcv::gam"' of mode 'function' was not found (或者在替换的情况下,返回NULL)。

    如果 模型 已更改为 "glm" "loess" 然后 formalArgs(model) formalArgs(eval(model)) 工作

    我认为这与这两个功能都来自基础有关 stats 打包while gam 不是。但是我该怎么解决呢?

    1 回复  |  直到 1 年前
        1
  •  1
  •   user2554330    1 年前

    问题是 "mgcv::gam" 是表达式的文本,而不是函数的名称。函数名称为 "gam"

    要检索表单,可以使用 formalArgs(x) 哪里 x 是搜索列表中可用的函数或实际函数对象的名称。

    这就是为什么 formalArgs(mgcv::gam) 有效,因为该表达式检索函数对象。其他方法是

        model <- mgcv::gam
        formalArgs(model)
    #>  [1] "formula"            "family"             "data"              
    #>  [4] "weights"            "subset"             "na.action"         
    #>  [7] "offset"             "method"             "optimizer"         
    #> [10] "control"            "scale"              "select"            
    #> [13] "knots"              "sp"                 "min.sp"            
    #> [16] "H"                  "gamma"              "fit"               
    #> [19] "paraPen"            "G"                  "in.out"            
    #> [22] "drop.unused.levels" "drop.intercept"     "nei"               
    #> [25] "discrete"           "..."
        model <- "mgcv::gam"
        obj <- eval(parse(text = model))
        formalArgs(obj)
    #>  [1] "formula"            "family"             "data"              
    #>  [4] "weights"            "subset"             "na.action"         
    #>  [7] "offset"             "method"             "optimizer"         
    #> [10] "control"            "scale"              "select"            
    #> [13] "knots"              "sp"                 "min.sp"            
    #> [16] "H"                  "gamma"              "fit"               
    #> [19] "paraPen"            "G"                  "in.out"            
    #> [22] "drop.unused.levels" "drop.intercept"     "nei"               
    #> [25] "discrete"           "..."
    

    创建于2023-10-03 reprex v2.0.2

    编辑后添加:正如您问题的评论所说,使用 formalArgs("gam") 也会起作用,但前提是 mgcv 在搜索列表中(因为您已运行 library(mgcv) 放在那里,或者一些等效的)。