2017-08-29 60 views
0

在下面的函數我一定要使用擬合GAM模型,以避免錯誤什麼在這個例子中使用mgcv :: GAM(bquote做一個功能

錯誤EVAL當bquote功能EXPR, envir,enclos):object'x'not found

當調用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-幫助說 「bquote引用它的參數,除了包在條款。()中指定的,其中環境。用法bquote被評估(表達式,其中= parent.frame())」。什麼是這裏的環境(parent.frame = plot_model環境?)以及在沒有bquote(通過gam調用創建的環境?)的情況下評估哪些環境?

回答

0

bquotex的值替換表達.(X)。因此,什麼是真正評價是:

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

這個錯誤彈出,因爲plot.gam要求尋找在全球環境中的符號x而不是plot_model環境。

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> 
+0

但即使使用bquote x不是在全球環境中,是什麼呢? – tover

+0

與'plot.gam'不同,'bquote'在**當前**環境中尋找'x',即'plot_model(x = bla)'。您將'bla'作爲參數'x'傳遞給'plot_model',所以'x'只能從該環境內(及其下行)訪問。但是,正如你在我的例子中看到的那樣,當你用'bquote'使用表達式'。(x)'時,符號'x'被替換爲它的值。 –

+0

但是,這是如何解釋當使用bquote調用gam時,plot.gam找到x? gam會在沒有bquote的情況下工作,它的情節只適用於bquote。爲什麼在用bquote估計gam後,x突然出現在圖上? – tover