Я пытаюсь понять код, который я не писал (plot.gam в mgcv), и есть вызов функции plot() с некоторыми странными параметрами, которые я не могу распознать (например, "P "). Я хотел бы выяснить, какой метод построения графика отправляется при этом вызове. findMethod() и подобные функции не помогают (я думаю, что сюжет - это S3). Я пробовал использовать библиотеку отладки, но это не позволяет вам «перейти» к вызову функции (как и базовые функции отладки).

Есть ли способ отслеживать все вызовы функций и связанные с ними отправки методов в R? Или, возможно, функция, в которую я могу передать строку, содержащую фактический вызов функции (а не только подпись), которая скажет мне, какой метод отправляется?

r
7
dan 25 Авг 2011 в 22:49

3 ответа

Лучший ответ

В 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 не был показан в списке, и мой текущий R мог не включать это исправление. Этот метод должен отображаться нормально, и общий совет в таких ситуациях будет заключаться в том, чтобы идентифицировать класс объекта (как я показал выше), а затем использовать methods() и аналогичные функции (например, showMethods()), чтобы определить, если конкретные методы, доступные для класса (ов) возвращаемого объекта.

5
Gavin Simpson 25 Авг 2011 в 19:34

Для классов S3 methods("plot") предоставит все методы, определенные для конкретной функции. В случае отправки S3 вызываемая будет основана на классе первого аргумента. Глядя на plot.gam, я предполагаю, что та часть, о которой вы спрашиваете, начинается с plot(x$smooth[[i]]), поэтому вам нужно увидеть, каков класс x$smooth[[i]] (где x - объект gam), чтобы определить, какой метод plot будет вызываться.

Я не знаю, как сделать это автоматически.

3
Brian Diggs 26 Авг 2011 в 14:52

Распечатайте класс объекта изнутри функции. Либо взломайте функцию, либо используйте trace ().

0
IRTFM 25 Авг 2011 в 19:28