gpt4 book ai didi

r - `[.` `ReferenceClass` 方法

转载 作者:行者123 更新时间:2023-12-02 08:34:58 25 4
gpt4 key购买 nike

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

最佳答案

这实际上是关于 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问题。

关于r - `[.` `ReferenceClass` 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22631968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com