В R, как узнать, какой метод отправляется для конкретного вызова функции? - PullRequest
5 голосов
/ 25 августа 2011

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

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

Ответы [ 3 ]

5 голосов
/ 25 августа 2011

В plot.gam() мы отмечаем, что plot() вызывается на x$smooth[[i]], который является объектом класса:

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

Для класса "mgcv.smooth" - это a plot() метод, и именно он используется для графика в общем случае. ?plot.gam упоминает, что это метод по умолчанию, используемый для большинства сглаживаний, но есть определенные методы для определенных типов сглаживания, поддерживаемые gam() (из раздела Details ?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()), чтобы определить, доступны ли конкретные методы для возвращаемый класс (ы) объекта.

2 голосов
/ 25 августа 2011

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

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

0 голосов
/ 25 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...