提问人:Earlien 提问时间:10/4/2023 更新时间:10/4/2023 访问量:33
mgcv::gam 作为字符串的 do.call 失败,但其他函数不会
do.call fails for mgcv::gam as string, but not other functions
问:
我正在尝试使用主函数作为主力来拟合几个不同的模型(每个函数都调用这个主函数,变量作为字符串,所需的参数传递给model
...
)
它适用于 和 ,但不适用于 。具体来说,除非我使用命名空间对函数名称进行硬编码,否则将失败。但我需要成为一个变量。发生相同的问题,我用来获取.例如(reprex)基于类似SO问题的建议:model = "loess"
model = "glm"
model = "gam"
do.call(model, args)
model
formalArgs
args
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))
我认为这与这两个函数都来自基本包有关,而不是。但是我该如何解决呢?stats
gam
答:
问题是表达式的文本,而不是函数的名称。函数名称为 。"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")
mgcv
library(mgcv)
评论
formalArgs("ggplot")
formalArgs("dplyr::select")
mgcv::gam
formalArgs
调用,因此保存在 中的字符串需要存在于环境中。所以然后应该工作。formals(def, envir = parent.frame)
model
library(mgcv)
model <- "gam"
formalArgs(model)
require(mgcv)
在调用 master 函数的包装函数中调用 where and reside。库的加载位置重要吗?或者,有没有办法做这样的事情,这样在哪里就无关紧要了?formalArgs
do.call
formals(def, envir = "mgcv")
formalArgs
model <- "gam"; fun <- function() {library(mgcv); formalArgs(model)}; fun()
mgcv
mgcv