【问题标题】:`[.` method for `ReferenceClass``ReferenceClass`的`[.`方法
【发布时间】:2014-03-25 10:38:39
【问题描述】:

我想为我的ReferenceClass 写一个[. 方法。到目前为止,我有这样的事情:

DT <- data.table(Index=1:5)

MySeries <- setRefClass("MySeries", fields = list(data="data.table"))

setMethod("[","MySeries",function(x, i,j,drop) {
  ii <- substitute(i)
  x$data <- x$data[eval(ii)]
  return(x)
})

S <- MySeries(data=DT)

...但是当我最终调用S[Index&gt;3] 时会引发错误。如何解决上述问题以获得预期的结果?

  Index
4:  4
5:  5

【问题讨论】:

    标签: r methods eval s4 reference-class


    【解决方案1】:

    这实际上是关于 eval(substitute()) 的使用,与 S4 方法的使用一样多。这是您感兴趣的泛型

    > getGeneric("[")
    standardGeneric for "[" defined from package "base"
    
    function (x, i, j, ..., drop = TRUE)
    standardGeneric("[", .Primitive("["))
    <bytecode: 0x42f4fe0>
    <environment: 0x3214270>
    Methods may be defined for arguments: x, i, j, drop
    Use  showMethods("[")  for currently available ones.
    

    您的方法签名与泛型不同(没有“...”且“drop”没有默认值),因此该方法具有嵌套的“.local”函数

    > getMethod("[", "MySeries")
    Method Definition:
    
    function (x, i, j, ..., drop = TRUE) 
    {
        .local <- function (x, i, j, drop) 
        {
            ii <- substitute(i)
            x$data <- x$data[eval(ii)]
            return(x)
        }
        .local(x, i, j, ..., drop)
    }
    
    Signatures:
            x         
    target  "MySeries"
    defined "MySeries"
    

    subsitute(i) 并不是你想的那样。相反,编写一个匹配通用签名的方法

    setMethod("[", "MySeries", function(x, i, j, ..., drop=TRUE) {
        x$data <- x$data[eval(substitute(i))]
        x
    })
    

    嵌套函数是 eval(substitute()) 范式的一个普遍问题,而不仅仅是 S4 方法的定义;见this问题。

    【讨论】:

    • 哇,当我快速输入我的签名 function(x,i,j,drop) 时,这是一个多么微妙的错误。感谢您对.local 的见解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2015-11-13
    • 2013-08-28
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多