4

我试图弄清楚R如何UseMethod找到一个方法,一旦它弄清楚它在寻找什么(即用MyClass类的x调用的函数MyGeneric(x):MyGeneric.MyClass)具体来说,涉及哪些环境?

我已阅读 R 语言手册的“5.3 Method Dispatching”和“5.4 UseMethod”部分,其中没有指定搜索机制。R-Help 页面UseMethod提供了一个线索:

...UseMethod and NextMethod search for methods in two places: 
first in the environment in which the generic function is called, 
and then in the registration data base for the environment 
in which the generic is defined (typically a namespace)

但这并没有加起来(在我的脑海里=)。这是一个具体的例子:

library( xts )
as.matrix  # shows UseMethod("as.matrix")
methods("as.matrix") # shows as.matrix.xts.  * indicates non-visible
showMethods("as.matrix")  # says <not an S4 generic function>
data(sample_matrix)
as.matrix( as.xts(sample_matrix) ) # how does R find as.matrix.xts??  its not exported!

as.matrix中定义namespace:base。如果 R 要使用该环境或调用环境 (R_GlobalEnv),则无法找到as.matrix.xts,因为它未导出。如果 xts 中的函数调用,则调用环境似乎可以工作,as.matrix因为as.matrix.xts将在调用环境中。我错过了什么?

4

2 回答 2

3

你读得不够仔细。它说“注册数据库”存储在泛型的环境(命名空间)中,而不是方法本身。在这种情况下base::as.matrix

> grep("as.matrix",ls(base:::.__S3MethodsTable__.), value=TRUE)
[1] "as.matrix.dist"   "as.matrix.raster" "as.matrix.xts"    "as.matrix.zoo"
于 2012-05-09T15:28:40.533 回答
1

除了增加我知识的 Joshua 的洞察力....在加载的 NAMESPACE 中与被导出不同。您可能已经看到 as.matrix.xts 函数具有以下任一功能:

 getAnywhere(as.matrix.xts)
 xts:::as.matrix.xts

尝试输入

search()

我还在 SO 或 rhelp 上看到了一个函数,该函数将显示 R 解释器的函数调用搜索路径,但目前我似乎找不到它。这会产生一个相当长的函数名称列表:

apropos("as", mode="function")

而这份名单还有半长:

apropos("^as\\.", mode="function") 
于 2012-05-09T15:53:45.967 回答