当`methods`失败时,如何判断函数调用正在使用什么方法?

Mic*_*ico 10 oop methods r r-maptools

不妨让猫从袋子里拿出来,并说当我呼唤plot一个课堂对象时,我已经尝试了大约一天来弄清楚发生了什么SpatialPolygons*.我的直觉是寻找plot.SpatialPolygonsDataFrame,这种方法适用于我见过和遇到的任何其他例子,但这种方式失败了.

快速举例:

美国各州.shp文件在这里.

library(maptools)
us.states<-readShapePoly("cb_2014_us_state_5m.shp")
plot(us.states)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

有点邋but但是无论如何 - 关键是对一个简单的调用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*                              
Run Code Online (Sandbox Code Playgroud)

答案似乎是在27-32号槽位; 然而,每一个都是一个令人烦恼的逗号!没有提到这是可能的?methods并且?plot,SpatialPolygons,missing-method是错误的.快速搜索missing-method没有任何使用,并且再次没有提到?methods.

好; 继续.怎么样getS3methodgetMethodgetMethodsgetAllMethods??

> 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
Run Code Online (Sandbox Code Playgroud)

后两者被弃用并且也没有返回.

显然,这些功能只是我的第一直觉的替身.

那么现在怎么办?如何判断plot传递的方法是SpatialPolygonsDataFrame什么?是否有任何一般方法来解决这个问题取代我上面使用的方法?

编辑:

我意外地偶然发现了这个(= ?`Spatial-Polygons-class`),其中说:

plot空间多边形的方法采用以下参数:

但它仍然没有说明那种方法究竟是什么.

Gre*_*gor 6

部分答案:方法是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")
Run Code Online (Sandbox Code Playgroud)

然后我更改了绘图调用以发出错误:

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

(除非您kasjdhfkjasdfhkas在工作区中将其定义为向量,否则应该有效).果然,

sp:::plot.SpatialPolygons
Run Code Online (Sandbox Code Playgroud)

显示了该方法的代码.


42-*_*42- 5

回答格雷戈尔提出的几个问题.该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.
Run Code Online (Sandbox Code Playgroud)

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, ...)
Run Code Online (Sandbox Code Playgroud)

这告诉你该类有一个S4函数.您可以执行任一操作sp:::SpatialPolygonsgetAnywhere(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
Run Code Online (Sandbox Code Playgroud)

这将显示plot当传递给它的对象与任何S4方法都不匹配时,调用-call的用法:

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, ...)
}
Run Code Online (Sandbox Code Playgroud)

基本上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"
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我在回复中看到了这一点?getMethods:

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

  • @joshuaulrich是故意混淆还是仅仅是我? (2认同)