10

plot猫をバッグから出して、 class のオブジェクトを呼び出すときに何が起こっているのかを把握するために約 1 日を費やしたと言いますSpatialPolygons*。私の本能は、私が見たり遭遇した他の多くの例で機能するアプローチを探すことですplot.SpatialPolygonsDataFrameが、これは失敗しました。

簡単な例:

米国の州の .shp ファイルはこちら。

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

サンプルプロット。 これは、目に見えない地球上に配置されたすべての米国の州と準州のポリゴンを示しています。 読みにくいですが、プロットはこの質問の主なものではありません。

少しばかげていますが、それはどうでもいいことです。要点は、すべての形状を表現するためにどのメソッドを呼び出すかをplot、どこかで単純に呼び出すだけで知っているということです。R

少し調べた後、まず何よりもまず、さまざまな SO Q&A で提案された他の 2 つのアプローチを試しました。

> 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

わかった; 先に進みます。どう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

後者の 2 つは非推奨であり、何も返しません。

どうやらこれらの関数は、私の最初の本能の代わりに過ぎないようです。

んで、どうする?plot渡されたときにどのメソッドが呼び出されているかをどのように確認できSpatialPolygonsDataFrameますか? 上記で使用したアプローチに取って代わる、この問題に対する一般的なアプローチはありますか?

編集:

偶然のように、私はこれ(= ?`Spatial-Polygons-class` )に出くわしました。

空間ポリゴンのplotメソッドは、次の引数を取ります。

しかし、その方法が正確に何であるかはまだ述べていません。

4

2 に答える 2

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

メソッドのコードを示しました。

于 2015-09-04T01:51:24.040 に答える
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.

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」とは、2 番目の引数が指定されていない状況を指し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これは、渡されたオブジェクトが 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, ...)
}

基本的に、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)
于 2015-09-04T03:19:52.317 に答える