S4方法的R 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(

我目前正在为一个S4类编写一个方法,我希望能够像调用函数一样调用该方法,并使用match.call()

下面是我正在做的最简单的例子:

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, ...)