= , =”、“>”的 6-6ren">
gpt4 book ai didi

r - "Ops"组通用方法和 match.call 用于延迟评估

转载 作者:行者123 更新时间:2023-12-04 09:32:03 26 4
gpt4 key购买 nike

我正在使用自定义指标语法语言 (ISL) 来设计和评估交易规则。

我想为我的自定义类定义基本的二元运算符方法 indicator .在 indicator 上的操作,例如 >= , <=等等,一旦评估,将有二进制输出(零或一),存储在类 signal 的另一个对象中. signal对象还应包含用于延迟评估的操作(未评估的表达式)的定义。

我的尝试:

### define classes

indicator <- function () {
structure(NULL, class="indicator")
}

signal <- function (definition) {
structure(NULL, call=definition, class="signal")
}

`Ops.indicator` <- function(x, y, ...) {
.call <- match.call()
ret <- signal(definition=.call)
}

### create unevaluated definitions of indicators and signals

ind <- indicator()
sig <- ind <= 2

对象的结构str(sig)是:

 list()
- attr(*, "call")= language Ops.indicator(x = ind, y = 2)
- attr(*, "class")= chr "signal"

而我需要用 <= 存储特定的表达式, 稍后评估:

 list()
- attr(*, "call")= language `<=.indicator`(x = ind, y = 2)
- attr(*, "class")= chr "signal"

如何重写Ops.indicator为此,无需在“==”、“!=”、“<”、“<=”、“>=”、“>”的 6 个独立指标方法中重复代码?

最佳答案

我会这样做:

indicator <- function ()  {
structure(list(), class="indicator")
}

binary_op <- function(op, x, y) {
structure(list(op = op, x = x, y = y), class = "binary_signal")
}

`Ops.indicator` <- function(x, y, ...) {
binary_op(.Generic, substitute(x), substitute(y))
}

ind <- indicator()
sig <- ind <= 2

关键是使用特殊的 .Generic 值,但我还做了一些其他的小调整:

  • 如果您将 S3 对象基于列表元素而不是属性,您会发现它们更易于使用

  • NULL 是一个单例,因此为其分配属性会默默地将其强制转换为 list()

  • 我认为如果您存储单独的部分而不是完整的调用,对象可能会更容易使用。

最后,您可能想阅读更多关于 domain specific languages in R 的信息.

关于r - "Ops"组通用方法和 match.call 用于延迟评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20084974/

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