Как определить, какой метод используется вызовом функции, когда `методы` терпят неудачу?

Можно также вытащить кошку из сумки и сказать, что я пытался около дня выяснить, что происходит, когда я вызываю plot для объекта класса SpatialPolygons*. Мой инстинкт - искать plot.SpatialPolygonsDataFrame, подход, который работает для любого количества других примеров, которые я видел и встречал, но это не удалось.

Быстрый пример:

US..shp файл здесь.

library(maptools)
us.states<-readShapePoly("cb_2014_us_state_5m.shp")
plot(us.states)

введите описание изображения здесь

Немного туповатое, но что угодно - дело в том, что простой вызов plot и где-то в глубине R знал, какой метод вызывать, чтобы дать нам представление всех фигур.

После небольшого поиска я попытался использовать два других подхода, предложенных различными SO Q & As, в первую очередь:

> methods(plot)
 [1] plot.aareg*                         plot.acf*                          
 [3] plot,ANY,ANY-method                 plot.cox.zph*                      
 [5] plot.data.frame*                    plot.decomposed.ts*                
 [7] plot.default                        plot.dendrogram*                   
 [9] plot.density*                       plot.ecdf                          
[11] plot.factor*                        plot.formula*                      
[13] plot.function                       plot.hclust*                       
[15] plot.histogram*                     plot.HoltWinters*                  
[17] plot.isoreg*                        plot.lm*                           
[19] plot.medpolish*                     plot.mlm*                          
[21] plot.ppr*                           plot.prcomp*                       
[23] plot.princomp*                      plot.profile.nls*                  
[25] plot.raster*                        plot.shingle*                      
[27] plot,SpatialGrid,missing-method     plot,SpatialLines,missing-method   
[29] plot,Spatial,missing-method         plot,SpatialPixels,missing-method  
[31] plot,SpatialPoints,missing-method   plot,SpatialPolygons,missing-method
[33] plot.spec*                          plot.spline*                       
[35] plot.stepfun                        plot.stl*                          
[37] plot.survfit*                       plot.table*                        
[39] plot.times*                         plot.trellis*                      
[41] plot.ts                             plot.tskernel*                     
[43] plot.TukeyHSD*                      plot.xyVector*                     
[45] plot.zoo*                              

Ответ будет отображаться в слотах 27-32; однако за каждой последует досадная запятая! Не упоминайте, что это возможно в ?methods, а ?plot,SpatialPolygons,missing-method - ошибка. Быстрый поиск missing-method не приносит ничего полезного, и в нем не упоминается ?methods.

OK; движется дальше. Как насчет getS3method? getMethod? getMethods? getAllMethods??

> getS3method("plot","SpatialPolygonsDataFrame")
Error in getS3method("plot", "SpatialPolygonsDataFrame") : 
  S3 method 'plot.SpatialPolygonsDataFrame' not found

> getMethod("plot","SpatialPolygonsDataFrame")
Error in getMethod("plot", "SpatialPolygonsDataFrame") : 
  no method found for function 'plot' and signature SpatialPolygonsDataFrame

Последние два устарели и не возвращают ничего.

Таким образом, по-видимому, эти функции - это просто средство для моих первых инстинктов.

Так что теперь? Как я могу определить, какой метод вызывается plot, когда он передан SpatialPolygonsDataFrame? Есть ли общий подход к этой проблеме, который заменяет подход, который я использовал выше?

Изменить:

Отчасти случайно я наткнулся на this (= ?`Spatial-Polygons-class`), в котором говорится:

Метод plot для пространственных полигонов принимает следующие аргументы:

но он все равно не говорит, что именно этот метод.

Ответ 1

Чтобы ответить на пару вопросов, поднятых Грегором. Функция methods ранее не показывала результаты для S4-методов, но теперь это происходит. Выполняя поиск в документе NEWS, я вижу, что это было добавлено с версией 3.2.0:

methods() reports S4 in addition to S3 methods; output is simplified when the class 
argument is used. .S3methods() and methods::.S4methods() report S3 and S4 methods separately.

SpatialPolygons - это объекты S4, и поэтому есть слоты и S4-методы, которые отправляются. Вы можете отобразить метод S4 с помощью:

showMethods(f='plot', classes='SpatialPolygons', includeDefs=TRUE)
#    ---- result ---
Function: plot (package graphics)
x="SpatialPolygons", y="missing"
function (x, y, ...) 
plot.SpatialPolygons(x, ...)

Это говорит вам, что для этого класса есть функция S4. Вы можете выполнить либо sp:::SpatialPolygons, либо getAnywhere(plot.SpatialPolygons), чтобы увидеть код функции. (Часто вызов с использованием includeDefs=TRUE будет отображать R-код, но не здесь.) Результат для methods(plot), когда загружен пакет "sp", говорит вам, что в рабочей области зарегистрировано 8 разных методов S4 участка. Элементы, следующие за запятыми, являются "сигнатурами", которые используются для отправки функций. "missing-method" относится к ситуациям, когда второй аргумент не указан, причем функция missing, выполняемая внутри тела функции, возвращает TRUE:

  [1] plot,ANY,ANY-method                 plot,color,ANY-method              
  [3] plot,Spatial,missing-method         plot,SpatialGrid,missing-method    
  [5] plot,SpatialLines,missing-method    plot,SpatialPixels,missing-method  
  [7] plot,SpatialPoints,missing-method   plot,SpatialPolygons,missing-method

Это покажет вам, что затем используется для отправки plot -call, когда переданный ему объект не соответствует ни одному из методов S4:

showMethods(f='plot', classes='ANY', includeDefs=TRUE)
Function: plot (package graphics)
x="ANY", y="ANY"
function (x, y, ...) 
UseMethod("plot")


x="color", y="ANY"
function (x, y, ...) 
{
    .local <- function (x, y, pch = 20, cex = 3) 
    pairs(coords(x), col = hex(x, fix = TRUE), pch = pch, cex = cex)
    .local(x, y, ...)
}

В основном интерпретатор R сначала проверяет, подходят ли какие-либо S4-методы, и, если это не так, начнет проходить через методы S3, пока не достигнет plot.default.

> getMethod(f='plot', signature=c(x='SpatialPolygons', y='missing'))
Method Definition:

function (x, y, ...) 
plot.SpatialPolygons(x, ...)
<environment: namespace:sp>

Signatures:
        x                 y        
target  "SpatialPolygons" "missing"
defined "SpatialPolygons" "missing"

И BTW Я вижу это в ответе от ?getMethods:

## Deprecated in 2010 and defunct in 2015 for \code{table = FALSE}:
getMethods(f, where, table = FALSE)

Ответ 2

Частичный ответ: метод sp:::plot.SpatialPolygons. Я не знаю, почему эти запятые появляются в результатах methods(plot); plot,SpatialPolygons,missing-method не имеет для меня никакого смысла (и я тоже вижу).

Я нашел ответ, вызвав ошибку. У меня нет файла формы, поэтому я взял пример из help("SpatialPolygonsDataFrame-class"), с которого я получил от ?SpatialPolygons". Пример ниже:

Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)
Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr3, Sr4), "s3/4")
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)
plot(SpP, col = 1:3, pbg="white")

Затем я изменил вызов сюжета, чтобы дать ошибку:

plot(SpP, col = kasjdhfkjasdfhkas, pbg = "white")
# Error in plot.SpatialPolygons(x, ...) : object 'kasjdhfkjasdfhkas' not found

(должен работать, если у вас нет kasjdhfkjasdfhkas, определенного в вашей рабочей области как вектор). Конечно,

sp:::plot.SpatialPolygons

показал код для метода.