2012-07-30 37 views
1

在R中,我經常需要循環訪問類型對象列表lm(例如glm,lme,clm),並使用新公式或其他參數更新它們。我使用lapply()這樣做,因爲它以相同的列表格式返回它們,並且名稱完好無損,所以我可以繼續此過程。在R中,如何動態使用update()?

有時候,我傳遞的論點是動態的,而且每個模型都有所不同。例如,

lapply(names(mylist) function(ii) { 
    jj<-myotherlist[[ii]]; 
    update(mylist[[ii]],.~.+jj) 
}) 

其中jj是被添加到列表中的每個模型的術語,並且在一些其他列表被定義對每個模型的基礎。

比方說,一個特定的模型預期的結果公式應該是y~a+b+c。取而代之的是,所產生的lm對象內部調用對象包含y~a+b+jj。因此,在某些情況下導致lm對象可以正常工作,但每當公式需要進行評估,它的錯誤,因爲jj早已不復存在。有沒有推薦的方法要麼力update()擴大它的參數中所有的變量時,其輸出寫入call對象或強制使用該call對象,以評估在lm對象的內部背景下的呼叫,而不是全球範圍內的功能,這樣至少我可以東西新的變量進入modeldata對象lm風格的對象通常包含哪些內容?

AND,如果用動態變量更新的部分是數據參數會怎樣?例如: -

data=cbind(sharedByAllModels,y=kk) 

...其中kk是唯一的當前模型(也許是某種在sharedByAllModels數據幀某些列的聚集)。

回答

2

回答您的主要問題,可以使用bquote()來控制更新公式對象的哪些部分(即.()內的那些部分)進行評估。

lapply(1:2, function(ii) { 
     jj <- as.name(myotherlist[[ii]]) 
     update(mylist[[ii]], substitute(. ~ . + jj)) 
     }) 
# [[1]] 
# y ~ a + b + c 
# 
# [[2]] 
# y ~ A + B + C 

mylist <- list(y ~ a + b, y ~ A + B) 
myotherlist <- list("c", "C") 

lapply(1:2, function(ii) { 
    jj <- as.name(myotherlist[[ii]]) 
    update(mylist[[ii]], bquote(. ~ . + .(jj)))}) 
# [[1]] 
# y ~ a + b + c 
# 
# [[2]] 
# y ~ A + B + C 

可替換地,以類似的方式使用substitute()