2017-01-09 27 views
2

我與寫調用使用get()爲什麼無法在gamm中找到對象,但它在lm中工作?

假設我有這個數據幀的變量的R功能掙扎:

mydat = data.frame(y = rnorm(100), 
        x = rnorm(100), 
        day = sample(90:260, 100, replace = T), 
        r1 = sample(seq(2008,2015,1), 100, replace = T), 
        r2 = sample(letters, 100, replace = T), 
        r3 = sample(letters, 100, replace = T)) 

,我想編寫一個返回GAMM模型的摘要函數,例如像這樣

gamm_summary = function(data, response = "y"){ 
    require(mgcv) 
    gamm_model = gamm(get(response) ~ s(day), 
         random = list(r1=~1, r2=~1, r3 =~1), data = data, method = "REML") 

    summary(gamm_model$gam) 
} 


gamm_summary(mydat) 

爲什麼這給我的錯誤:

Error in get(response) : object 'response' not found

但以下幾項工作:

lm_summary = function(data, response = "y") { 
    lm_model = lm(get(response) ~ x, data = data) 
    summary(lm_model) 
} 

lm_summary(mydat) 

問:爲什麼無法得到我GAMM功能工作,我怎麼可以重寫,以便它能發揮的作用?

+1

嘗試使用此功能'?reconulate' –

回答

2
require(mgcv) 
gamm_summary = function(mydata, a1 = "y", b1 = "day", rnd1 = "r1", rnd2 = "r2", rnd3 = "r3"){ 
    df = data.frame(aa = mydata[[a1]], bb = mydata[[b1]], rnd1 = mydata[[rnd1]], rnd2 = mydata[[rnd2]], rnd3 = mydata[[rnd3]]) 
    gamm_model = gamm(aa ~ s(bb), data = df, random = list(rnd1 =~ 1, rnd2 =~ 1, rnd3 =~ 1), method = "REML") 
    summary(gamm_model$gam) 
} 

gamm_summary(mydat, a1 = "x") 
+1

感謝您的回答。這很有幫助,雖然它實際上並不奏效。它似乎工作,因爲你使用相同的名稱作爲原始響應變量名稱創建的響應變量。如果你在你的函數y中用z替換,你會得到一個錯誤。但是使用數據$ z = data [,response]而不是z = data $ response將會起作用。 –

+1

謝謝。這也適用。 –

相關問題