2

我想[.为我的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>3]. 如何解决上述问题以获得预期的结果?

  Index
4:  4
5:  5
4

1 回答 1

6

这实际上是关于使用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 方法的定义;看到这个问题。

于 2014-03-25T12:23:43.940 回答