substitute,eval,bquote,do.call ...替换表达式的一些指导

Kar*_* W. 3 r time-series

我想编写一个时间序列课程.我的想法是,我用一个表达式和一些其他时间序列对象实例化一个对象

(两个时间序列)

x <- ts(rnorm(10), frequency = 4, start = c(1959, 2))  
y <- ts(rnorm(10), frequency = 4, start = c(1959, 2))  
Run Code Online (Sandbox Code Playgroud)

(时间序列,定义为x和y的总和)

z <- exprTs("x+y", parents=list(x=x, y=y)) 
Run Code Online (Sandbox Code Playgroud)

(获得系列的一部分)

window(z, start=1960, end=1960.75)
Run Code Online (Sandbox Code Playgroud)

问题是,我该如何评估表达式?我尝试了以下方法:

#(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, ...))  
}  
Run Code Online (Sandbox Code Playgroud)

我无法让窗口方法起作用.

如果你可以指导我如何恰当地使用substitute,eval,do.call,那将非常有帮助.

Jon*_*ang 5

一个问题是您将表达式指定为字符串,因此它将被计算为字符串.如果要将字符串解析为表达式,则需要使用以下parse命令:

> "x+y"
[1] "x+y"
> parse(text="x+y")
expression(x+y)
attr(,"srcfile")
<text> 
Run Code Online (Sandbox Code Playgroud)

但是,为什么不使用apply和功能呢?


Dir*_*tel 5

你可能会以错误的方式思考这个问题而只是过于复杂化.已经为ts对象定义了一个附加内容:

R> set.seed(42)
R> x <- ts(rnorm(10), frequency = 4, start = c(1959, 2))
R> y <- ts(rnorm(10), frequency = 4, start = c(1959, 2))
R> z <- x + y
R> cbind(x,y,z)
               x       y       z
1959 Q2  1.37096  1.3049  2.6758
1959 Q3 -0.56470  2.2866  1.7219
1959 Q4  0.36313 -1.3889 -1.0257
1960 Q1  0.63286 -0.2788  0.3541
1960 Q2  0.40427 -0.1333  0.2709
1960 Q3 -0.10612  0.6360  0.5298
1960 Q4  1.51152 -0.2843  1.2273
1961 Q1 -0.09466 -2.6565 -2.7511
1961 Q2  2.01842 -2.4405 -0.4220
1961 Q3 -0.06271  1.3201  1.2574
R> 
Run Code Online (Sandbox Code Playgroud)

您不需要表达式解析器来操作R对象.