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