2011-08-25 45 views
5

我想了解一些我沒有寫的代碼(plot.gam in mgcv),並且有一個調用plot()函數的一些奇怪的參數,我不認識(例如,「P」) 。我想知道在這次調用中哪個繪圖方法正在分派。 findMethod()和類似的函數沒有幫助(我認爲情節是S3)。我嘗試了調試庫,但是這不會讓你「進入」一個函數調用(並且基本調試功能也沒有)。在R中,如何找出爲特定函數調用分派哪個方法?

有什麼辦法可以監視R中的所有函數調用及其相關的方法調度嗎?或者可能是一個函數,我可以傳遞一個包含實際函數調用(不僅僅是簽名)的字符串,它會告訴我調度了什麼方法?

+0

就在旁邊。 。 。當在函數調用中指定參數時,可以將參數的名稱截斷爲任何明確的。因此,如果簽名中只有一個參數_starts_帶有'P',則可以通過'P ='指定該參數。這不能回答你的問題,因此它只是一個評論。 – adamleerich

回答

5

plot.gam()我們注意到,plot()叫上x$smooth[[i]],它是類的一個對象:

class(x$smooth[[i]]) 
[1] "tprs.smooth" "mgcv.smooth" 

"mgcv.smooth"plot()方法,正是這種正在使用的情節在一般情況下。 ?plot.gam提到,這是用於大多數撫平默認方法,但也有某些類型的順利通過gam()支持的具體方法(從?plot.gam細節部分:

For smooth terms ‘plot.gam’ actually calls plot method functions 
depending on the class of the smooth. Currently random effect and 
Markov random field smooths have special methods, the rest use the 
defaults described below. 

出於某種原因,methods()是沒有找到這些方法,但它們確實存在:

> mgcv:::plot.mgcv.smooth 
function (x, P = NULL, data = NULL, label = "", se1.mult = 1, 
    se2.mult = 2, partial.resids = FALSE, rug = TRUE, se = TRUE, 
    scale = -1, n = 100, n2 = 40, pers = FALSE, theta = 30, phi = 30, 
    jit = FALSE, xlab = NULL, ylab = NULL, main = NULL, ylim = NULL, 
    xlim = NULL, too.far = 0.1, shade = FALSE, shade.col = "gray80", 
    shift = 0, trans = I, by.resids = FALSE, scheme = NULL, ...) 
{ 
.... 

這可能與在methods()一個bug這意味着plot.function不顯示列表中的n,我當前的R可能不包含該修復。這種方法應該正常顯示,並且在這種情況下的一般建議是識別對象的類別(如上所示),然後使用methods()和類似函數(例如showMethods())來確定該類的可用特定方法)返回的對象。

+0

是的,那是我的問題 - 它沒有出現在方法()中。但這是對的 - 謝謝! – dan

2

對於S3類,methods("plot")將給出爲特定函數定義的所有方法。作爲S3派遣,被調用的派生將基於第一個參數的類。看看plot.gam,我假設你所問的部分開始plot(x$smooth[[i]]),所以你需要看看x$smooth[[i]]的類是什麼(其中x是對象gam對象)來確定將調用什麼plot方法。

我不知道自動執行此操作的方法。

+0

我曾試過這樣做。我知道x $ smooth [[i]]是mgcv.smooth類的,但我不知道如何,通過S3課程,我可以從知道到知道哪個plot()被調度。沒有什麼具體的東西從一個方法()調用中跳出來。如果這是S4,那麼就像getMethod()和類簽名一樣工作。但我不知道如何處理S3方法。(我手動檢查了所有可見的繪圖函數,沒有看起來正確。) – dan

+0

錯字:'方法',而不是'方法'。 –

+0

@洪,謝謝。固定。 –

0

從函數內部打印對象的類。要麼破解該函數,要麼使用trace()。

相關問題