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

do.call fails for mgcv::gam as string, but not other functions

提问人:Earlien 提问时间:10/4/2023 更新时间:10/4/2023 访问量:33

问:

我正在尝试使用主函数作为主力来拟合几个不同的模型(每个函数都调用这个主函数,变量作为字符串,所需的参数传递给model...)

它适用于 和 ,但不适用于 。具体来说,除非我使用命名空间对函数名称进行硬编码,否则将失败。但我需要成为一个变量。发生相同的问题,我用来获取.例如(reprex)基于类似SO问题的建议:model = "loess"model = "glm"model = "gam"do.call(model, args)modelformalArgsargs

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

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

如果改为 或 ,则 和 工作。model"glm""loess"formalArgs(model)formalArgs(eval(model))

我认为这与这两个函数都来自基本包有关,而不是。但是我该如何解决呢?statsgam

R 命名空间 glm mgcv do.call

评论

0赞 Earlien 10/4/2023
关于基本函数与其他包,有效但无效。因此,虽然不限于 ,但很难预测它适用于哪些软件包以及不适用于哪些软件包formalArgs("ggplot")formalArgs("dplyr::select")mgcv::gam
2赞 thelatemail 10/4/2023
formalArgs调用,因此保存在 中的字符串需要存在于环境中。所以然后应该工作。formals(def, envir = parent.frame)modellibrary(mgcv)model <- "gam"formalArgs(model)
0赞 Earlien 10/4/2023
require(mgcv)在调用 master 函数的包装函数中调用 where and reside。库的加载位置重要吗?或者,有没有办法做这样的事情,这样在哪里就无关紧要了?formalArgsdo.callformals(def, envir = "mgcv")
1赞 thelatemail 10/4/2023
我认为如果之前调用它应该可以工作 - 例如 -formalArgsmodel <- "gam"; fun <- function() {library(mgcv); formalArgs(model)}; fun()
0赞 Earlien 10/4/2023
@thelatemail 实际上,我认为出于某种原因,我的库被重置了,没有重新加载,而其他库则被重新加载。我认为您的解决方案有效 - 只需要加载。如果您想将其添加为答案,我将接受此答案。mgcvmgcv

答:

3赞 user2554330 10/4/2023 #1

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

若要检索形式,可以使用 where 是搜索列表中可用的函数的名称,也可以使用实际的函数对象。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")mgcvlibrary(mgcv)