【问题标题】:What does bquote do in this example using mgcv::gam in a function在这个例子中,bquote 在函数中使用 mgcv::gam 做了什么
【发布时间】:2018-02-06 19:14:14
【问题描述】:

在下面的函数中我必须在拟合gam模型时使用bquote函数以避免错误

eval(expr, envir, enclos) 中的错误:找不到对象“x”

当调用 plot.gam 时。由于我要绘制的因子变量而发生错误。但是我真的不明白 bquote 在这里做什么以及为什么需要它。

library(mgcv)
plot_model <- function(x){
  # agam <- gam(mean ~ s(bla) + bla2, data=x)
  agam <- eval(bquote(mgcv::gam(mean ~ s(bla) + bla2, data=.(x))))
  plot(agam, pages=1, all.terms = TRUE)
}
bla <- data.frame(bla=rnorm(20), bla2=sample(letters[1:4], size=20, replace=T), 
                  mean=sample(20))

plot_model(bla)

R-help 说“bquote 引用它的参数,除了包含在 .() 中的术语在指定的 where 环境中进行评估。用法 bquote(expr, where = parent.frame())。”这里的 where 环境是什么(parent.frame = plot_model 环境?),如果没有 bquote(调用 gam 创建的环境?),它将在什么环境中进行评估?

【问题讨论】:

    标签: r mgcv


    【解决方案1】:

    bquote 将表达式.(X) 替换为x 的值。因此实际评估的是:

    mgcv::gam(mean ~ s(bla) + bla2, data = list(bla = c(-0.147370861075094, <...>)
    

    因为plot.gam要求在全局环境而不是plot_model的环境中寻找符号x,所以弹出这个错误。

    使用recover调试时:

    <...>
    3: plot.gam(agam, pages = 1, all.terms = TRUE)
    4: termplot(x, se = se, rug = rug, col.se = 1, col.term = 1, main = attr(x$pterms, "term.
    5: eval(model$call$data, envir)
    <...>
    Browse[1]> envir
    <environment: R_GlobalEnv>
    

    【讨论】:

    • 但即使使用 bquote x 也不在全局环境中,是吗?
    • plot.gam 不同,bquote当前 环境中查找 x,即 plot_model(x = bla)。您将bla 传递给plot_model 作为参数x,因此x 只能从该环境(及其后代)中访问。但是,正如您在我的示例中所看到的,当您将表达式 .(x)bquote 一起使用时,符号 x 将替换为其值。
    • 但这如何解释当使用 bquote 调用 gam 时 plot.gam 找到 x 呢? gam 可以在没有 bquote 的情况下工作,它的情节只适用于 bquote。为什么在用 bquote 估计 gam 后 x 突然可用于绘图?
    • 要理解这一点,您需要熟悉 R 表达式的概念。表达式可以看作是一段未求值的代码(尽管它与字符串不同)。在您的示例中,您做了两件事:首先将表达式从 gam(..., data=x) 扩展为 gam(..., data=list(bla=..., bla2=))(注意在此阶段它仍然是 code),接下来,您评估这个修改后的表达式(其中不再存在x)使用eval
    • 顺便说一句,这显然是plot.gam 中的一个错误,因此应报告给 mgcv 的维护者。
    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2011-04-15
    相关资源
    最近更新 更多