当“方法”失败时,如何判断函数调用正在使用什么方法?
How to tell what method is being used by a function call when `methods` fails?
不妨让猫从袋子里出来,说我已经尝试了大约一天来弄清楚当我为 class 的对象调用 plot
时发生了什么 SpatialPolygons*
。我的直觉是寻找 plot.SpatialPolygonsDataFrame
,这种方法适用于我见过和遇到的任何其他示例,但是失败了。
快速示例:
library(maptools)
us.states<-readShapePoly("cb_2014_us_state_5m.shp")
plot(us.states)
有点笨拙,但无论如何 - 关键是对 plot
的简单调用和深处的某个地方 R
知道调用哪个方法以便为我们提供所有形状的表示.
经过一番搜索后,我尝试了各种 SO 问答建议的其他两种方法,首先也是最重要的:
> 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
后两者已弃用,而且 return 什么也没有。
显然这些函数只是我第一直觉的替代品。
那么现在呢?当传递给 SpatialPolygonsDataFrame
时,如何判断 plot
正在调用哪个方法?是否有解决此问题的通用方法可以取代我在上面使用的方法?
编辑:
我偶然发现了 this (=?`Spatial-Polygons-class`
) 上面写着:
The plot
method for spatial polygons takes the following arguments:
但它仍然没有说明该方法到底是什么。
部分回答:方法是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
显示了该方法的代码。
回答格雷戈尔提出的几个问题。 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, ...)
这告诉您 class 有一个 S4 函数。您可以执行 sp:::SpatialPolygons
或 getAnywhere(plot.SpatialPolygons)
来查看函数代码。 (通常使用 includeDefs=TRUE
的调用会显示 R 代码,但此处不会。)加载包 'sp' 时 methods(plot)
的结果告诉您注册了 8 种不同的 plot S4 方法在工作区中。逗号后面的项目是用于函数调度的 "signatures" 。 "missing-method"指的是没有指定第二个参数的情况,其中在函数体内执行的missing
函数会return 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
这将向您展示当传递给它的对象与任何 S4 方法不匹配时用于调度 plot
调用的内容:
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)
不妨让猫从袋子里出来,说我已经尝试了大约一天来弄清楚当我为 class 的对象调用 plot
时发生了什么 SpatialPolygons*
。我的直觉是寻找 plot.SpatialPolygonsDataFrame
,这种方法适用于我见过和遇到的任何其他示例,但是失败了。
快速示例:
library(maptools)
us.states<-readShapePoly("cb_2014_us_state_5m.shp")
plot(us.states)
有点笨拙,但无论如何 - 关键是对 plot
的简单调用和深处的某个地方 R
知道调用哪个方法以便为我们提供所有形状的表示.
经过一番搜索后,我尝试了各种 SO 问答建议的其他两种方法,首先也是最重要的:
> 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
后两者已弃用,而且 return 什么也没有。
显然这些函数只是我第一直觉的替代品。
那么现在呢?当传递给 SpatialPolygonsDataFrame
时,如何判断 plot
正在调用哪个方法?是否有解决此问题的通用方法可以取代我在上面使用的方法?
编辑:
我偶然发现了 this (=?`Spatial-Polygons-class`
) 上面写着:
The
plot
method for spatial polygons takes the following arguments:
但它仍然没有说明该方法到底是什么。
部分回答:方法是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
显示了该方法的代码。
回答格雷戈尔提出的几个问题。 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, ...)
这告诉您 class 有一个 S4 函数。您可以执行 sp:::SpatialPolygons
或 getAnywhere(plot.SpatialPolygons)
来查看函数代码。 (通常使用 includeDefs=TRUE
的调用会显示 R 代码,但此处不会。)加载包 'sp' 时 methods(plot)
的结果告诉您注册了 8 种不同的 plot S4 方法在工作区中。逗号后面的项目是用于函数调度的 "signatures" 。 "missing-method"指的是没有指定第二个参数的情况,其中在函数体内执行的missing
函数会return 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
这将向您展示当传递给它的对象与任何 S4 方法不匹配时用于调度 plot
调用的内容:
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)