我想编程一个时间序列课程。这个想法是我用一个表达式和一些其他时间序列对象实例化一个对象,例如
(两个时间序列)
x <- ts(rnorm(10), frequency = 4, start = c(1959, 2))
y <- ts(rnorm(10), frequency = 4, start = c(1959, 2))
(一个时间序列,定义为x和y的总和)
z <- exprTs("x+y", parents=list(x=x, y=y))
(获得系列的一部分)
window(z, start=1960, end=1960.75)
问题是,如何评估表达式?我尝试了以下方法:
#(constructor for class)
exprTs <- function(expr, parents) {
res = list(expr=expr, parents=parents)
class(res) <- "exprTs"
res
}
#(window method)
window.exprTs <- function(z, ...) {
eval(substitute(z$expr, lapply(z$parents, window, ...)))
#do.call(z$expr, lapply(z$parents, window, ...))
}
我无法使window方法起作用。
如果您可以指导我正确使用替代方法eval,do.call,那将非常有帮助。
最佳答案
一个问题是您将表达式指定为字符串,因此它将被评估为字符串。如果要将字符串解析为表达式,则需要使用parse
命令:
> "x+y"
[1] "x+y"
> parse(text="x+y")
expression(x+y)
attr(,"srcfile")
<text>
但是,为什么不使用
apply
和函数呢?