R `[.`引用类的方法]`

R `[.`引用类的方法]`,r,methods,eval,s4,reference-class,R,Methods,Eval,S4,Reference Class,我想为我的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(i

我想为我的
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)

这实际上是关于使用
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.

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

哇,当我快速键入签名
函数(x,I,j,drop)
时,这是一个多么微妙的错误。感谢您对
的深入了解。local
> 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.
> 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"
setMethod("[", "MySeries", function(x, i, j, ..., drop=TRUE) {
    x$data <- x$data[eval(substitute(i))]
    x
})