Dan*_*ian 2 methods eval r 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(ii)]
return(x)
})
S <- MySeries(data=DT)
Run Code Online (Sandbox Code Playgroud)
...但是当我最后打电话时它会抛出一个错误S[Index>3].如何解决上述问题以获得此预期结果?
Index
4: 4
5: 5
Run Code Online (Sandbox Code Playgroud)
这实际上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.
Run Code Online (Sandbox Code Playgroud)
您的方法签名与泛型不同(没有'...'并且没有'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"
Run Code Online (Sandbox Code Playgroud)
而subsitute(i)不是你认为它是.相反,编写一个匹配通用签名的方法
setMethod("[", "MySeries", function(x, i, j, ..., drop=TRUE) {
x$data <- x$data[eval(substitute(i))]
x
})
Run Code Online (Sandbox Code Playgroud)
嵌套函数是eval(substitute())范例的一般问题,而不仅仅是S4方法的定义; 看到这个问题.