S4方法的R match.call()
我目前正在为一个S4类编写一个方法,我希望能够像调用函数一样调用该方法,并使用match.call() 下面是我正在做的最简单的例子:S4方法的R match.call(),r,R,我目前正在为一个S4类编写一个方法,我希望能够像调用函数一样调用该方法,并使用match.call() 下面是我正在做的最简单的例子: setClass( Class = "AClass", representation = representation( name = "character" ) ) setGeneric("meth1", function(object, ...) { standardGeneric("meth1") }) setMethod(
setClass(
Class = "AClass",
representation = representation(
name = "character"
)
)
setGeneric("meth1", function(object, ...) {
standardGeneric("meth1")
})
setMethod(
f = "meth1",
signature = "AClass",
definition = function(object, method, ..., warnings = TRUE) {
# ...
print(match.call())
return(NA)
})
根据这个定义,我明白了:
> meth1(new("AClass"), method = "MClust")
.local(object = object, method = "MClust")
[1] NA
> meth1(new("AClass"), method = Mclust)
.local(object = object, method = ..1)
[1] NA
问题是:
match.call()
获得的内容是.1
insetad fo“Mclust”
match.call()
获取的“函数名”是.local
而不是meth1
方法获取“Mclust”
当涉及到
…
和多层函数调用时,如何匹配.call
会出现一些问题。这与match有关。调用搜索词法堆栈以查找要替换的…
,而不是动态堆栈。我编写了一个程序包,试图纠正这些问题:
devtools::install_github("brodieg/matchcall") # <-- the package in question
library(matchcall)
setMethod(
f = "meth1",
signature = "AClass",
definition = function(object, method, ..., warnings = TRUE) {
# ...
print(match.call())
print(match_call())
print(match_call(2))
return(NA)
})
meth1(new("AClass"), method = Mclust)
因此,为了回答问题2,您得到.local
的原因是,有一系列调用最终导致对您定义的函数进行求值,并且S4将该函数存储为.local
问题1的答案很复杂,但您可以查看我的软件包附带的中的详细信息。请注意,在C代码中,..
参数内部有名称.1
,.2
,等等(from):
回想一下,函数的求值框最初包含匹配调用中的名称=值对,因此对于。。。也价值。。。是一个(特殊)成对列表,其元素由特殊符号..1,..2,…引用,这些符号设置了DDVAL位:当遇到其中一个时,(通过ddfindVar)在。。。评估框架中的符号
关于问题3,我不明白。您是否希望能够将一个不带引号的变量作为参数“method”输入,然后将其解释为一个字符
注意该软件包目前仅在github上,但是您可以使用sys.calls
来满足您的需要。例如,如果我们在您的方法中运行print(sys.calls())
,我们会得到:
[[1]]
meth1(new("AClass"), method = Mclust)
[[2]]
meth1(new("AClass"), method = Mclust)
[[3]]
.local(object, ...)
您可以直接使用它,但只有在调用中完全指定参数名称(即,如果有人执行meth1(x,“blah”)
,您将无法在sys.calls
中获得方法=
的一部分。如果您有多个参数或部分指定的参数(例如,meth=X
)然后你必须做更多的工作来匹配东西(这正是match\u call
所做的).你能澄清问题3的意思吗?你想把MClust
符号解释为一个字符吗?换句话说,你想让你的用户不必引用它就可以键入MClust
?事实上,你回答了所有的问题。我想要的是得到字符串“MClust”
分配给方法
。
[[1]]
meth1(new("AClass"), method = Mclust)
[[2]]
meth1(new("AClass"), method = Mclust)
[[3]]
.local(object, ...)