2015-09-04 27 views
10

不妨讓貓從袋子裏走出來,並說我一直在嘗試約一天的時間來找出發生了什麼,當我呼叫plot爲類SpatialPolygons*的對象。我的直覺是尋找plot.SpatialPolygonsDataFrame,這種方法適用於我見過的任何其他示例&遇到,但這失敗了。如何判斷`methods`失敗時函數調用正在使用什麼方法?

簡單的例子:

US States .shp file這裏。

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

enter image description here

有點矮胖但不管 - 的一點是,要plot一個簡單的通話和地方內心深處R知道,爲了給我們的所有形狀的表示要調用哪個方法。

了一下週圍搜索後,我嘗試了兩種其它方法的各種SO Q &作爲,首先建議:

> 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;繼續。那麼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 

後兩種已被棄用&也返回什麼。

顯然這些功能只是我第一本能的替身。

那麼現在呢?如何通過plot通過SpatialPolygonsDataFrame來判斷哪個方法被調用?這個問題是否有任何通用的方法取代我上面使用的方法?

編輯:

排序事故,我偶然發現this(= ?`Spatial-Polygons-class`),它說:

The plot method for spatial polygons takes the following arguments:

,但仍不能說的方法是,究竟是什麼。

+1

的 「令人煩惱的逗號」 ** **是在'methods'提到? * Details *部分的第二段說:「S4方法簽名被打印爲'generic,class-method'; S4允許多次調度,所以簽名中可能有幾個類'generic,A,B-method' 「。以及[如何查看函數的源代碼?](http://stackoverflow.com/q/19226816/271616)的答案中描述瞭如何查看S4方法的源代碼。 –

+1

只是爲了澄清,'方法'功能從來沒有「告訴你使用哪種方法」。它只告訴你哪些方法可以從加載的包中獲得。 –

回答

5

回答Gregor提出的幾個問題。功能methods以前沒有顯示S4方法的結果,但現在它已經完成了。在做新聞的文件我看到這個搜索與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:::SpatialPolygonsgetAnywhere(plot.SpatialPolygons)以查看功能代碼。 (通常使用includeDefs=TRUE的這個調用將顯示R代碼,但不在這裏。)加載包「sp」時methods(plot)的結果告訴您在工作區中註冊了8種不同的plot S4方法。逗號後面的項目是用於功能調度的「簽名」。 「失蹤法」是指在未指定第二個參數的情況下,其中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" 

而且順便說一句我看到這從?getMethods響應:

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

任何想法爲什麼說,即使sp特別加載缺少的方法?我對答案的最初反應是,這是maptools調用sp函數,即使我沒有直接加載sp ... – MichaelChirico

+0

@MichaelChirico:「失蹤」並不意味着該方法丟失。這是簽名中的一種特殊類型(另一種是「ANY」)。 –

+2

@joshuaulrich是故意混淆還是僅僅是我? – MichaelChirico

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") 

我再改劇情調用給出錯誤:

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

(應該工作,除非你有你的工作空間定義爲一個向量kasjdhfkjasdfhkas)。果然,

sp:::plot.SpatialPolygons 

顯示該方法的代碼。

+0

這些都是很好的答案 - 如果將來遇到類似的問題,你肯定會提供一些很好的調查工具。謝謝。 – MichaelChirico

相關問題