我试图找出R UseMethod
一旦找出它寻找的方法(即函数MyGeneric(x)用类MyClass x调用的函数MyGeneric.MyClass)
具体来说,涉及哪些环境?
我已阅读R语言手册的“5.3 Method Dispatching”和“5.4 UseMethod”部分,该部分未指定搜索机制。 UseMethod
的R-Help页面提供了一个线索:
...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
将在调用环境中。我错过了什么?
答案 0 :(得分: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"
答案 1 :(得分: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")