在R中,如何找出为特定函数调用分派的方法?

时间:2011-08-25 18:49:36

标签: r

我正在尝试理解一些我没写的代码(mg.gv中的plot.gam),并且调用了plot()函数,其中包含一些我无法识别的奇怪参数(例如,“P” )。我想弄清楚这个调用中正在调度哪个绘图方法。 findMethod()和类似的函数没有帮助(我认为情节是S3)。我尝试了调试库,但这不会让你“进入”函数调用(基本调试函数也没有)。

有没有办法监控R中的所有函数调用及其相关的方法调度?或者也许是一个函数,我可以传递一个包含实际函数调用的字符串(不仅仅是签名),它会告诉我调度哪个方法?

3 个答案:

答案 0 :(得分:5)

plot.gam()中,我们注意到plot()x$smooth[[i]]上调用,class(x$smooth[[i]]) [1] "tprs.smooth" "mgcv.smooth" 是类的对象:

plot()

对于类"mgcv.smooth" 是一个?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()

这可能与plot.function中的错误相关,该错误意味着methods()未显示在列表中,而我当前的R可能未包含该修复。这种方法应该正常显示,在这种情况下的一般建议是识别对象类(如上所示),然后使用showMethods()和类似函数(例如{{1}})来识别是否可用于返回对象的类的特定方法。

答案 1 :(得分:2)

对于S3类,methods("plot")将提供为特定函数定义的所有方法。作为S3调度,调用的调度将基于第一个参数的类。查看plot.gam,我假设您要询问的部分是plot(x$smooth[[i]]),所以您需要查看x$smooth[[i]]的类是什么(其中x是对象{ {1}} object)确定将调用gam方法。

我不知道如何自动执行此操作。

答案 2 :(得分:0)

从函数内部打印对象的类。破解函数或使用trace()。