我們展示瞭如何做到這一點使用代理對象(見本document的代理部分),先用proto package然後無:
1)原。由於confint.lm
正在呼叫vcov
,因此我們需要確保(a)vcov
的新替代版本位於修訂版confint.lm
的環境中,並且(b)修訂版confint.lm
仍然可以從其原始版本訪問對象。 (例如,confint.lm
在統計調用隱藏功能format.perc
所以,如果我們沒有第二點安排是真實的,隱藏的功能無法訪問。)
要執行上面我們做一個新confint.lm
這是除了它有一個新的環境(代理環境),其中包含我們的替代品vcov
,並且其父代又是原始的confint.lm
環境。在下面,代理環境被實現爲原始對象,其中這裏要知道的關鍵項目是:(a)原始對象是環境並且(b)以所示的方式將功能放置在原始對象中,從而將其環境改變爲原始對象。同樣爲了避免S3派遣confint
到confint.lm
的任何問題,我們直接調用confint.lm
方法。
雖然hccm
似乎並沒有什麼不同的結果在這裏我們可以驗證它被注意到的trace
的輸出運行:
library(car)
library(proto)
trace(hccm)
model <- lm(len ~ dose, data=ToothGrowth)
proto(environment(stats:::confint.lm), # set parent
vcov = function(x) hccm(x), #robust var-cov matrix
confint.lm = stats:::confint.lm)[["confint.lm"]](model)
另一個例子,見例2 here。
2)環境。該代碼是更加繁重沒有原位(實際上它大致加倍的代碼大小),但在這裏它是:
library(car)
trace(hccm)
model <- lm(len ~ dose, data=ToothGrowth)
local({
vcov <- function(x) hccm(x) #robust var-cov matrix
confint.lm <- stats:::confint.lm
environment(confint.lm) <- environment()
confint.lm(model) # confint will call vcov, but not the above one.
}, envir = new.env(parent = environment(stats:::confint.lm)))
編輯:清晰度的各種改進
這很棒,我不熟悉proto軟件包,但它似乎相當有用。我繼續閱讀小插曲,這是一個很好的閱讀。感謝您付出的努力! – Stefan 2012-02-23 07:45:21