substitute, eval, bquote, do.call ... некоторые рекомендации по замене выражений - PullRequest
3 голосов
/ 22 января 2010

Я бы хотел запрограммировать класс временных рядов. Идея состоит в том, что я создаю экземпляр объекта с выражением и некоторыми другими объектами временных рядов, например

(два временных ряда)

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, ...))  
}  

Я не могу заставить метод окна работать.

Если бы вы могли научить меня, как правильно использовать замену, eval, do.call, это было бы очень полезно.

Ответы [ 3 ]

5 голосов
/ 22 января 2010

Вы можете думать об этом неправильно и просто слишком усложнять вещи. Для объектов 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> 

Вам действительно не нужен анализатор выражений для работы с объектами R.

5 голосов
/ 22 января 2010

Одна проблема заключается в том, что вы задаете выражение в виде строки, чтобы оно было оценено в строку.Если вы хотите проанализировать строку в выражении, вам нужно использовать команду parse:

> "x+y"
[1] "x+y"
> parse(text="x+y")
expression(x+y)
attr(,"srcfile")
<text> 

Но да, почему бы не использовать apply и функции вместо этого?

1 голос
/ 22 января 2010

Теперь я нашел решение:

window.exprTs <- function(z, ...) {  
  names(z$parents)<-NULL  
  do.call(z$expr, lapply(z$parents, window, ...))  
}  

plus <- function(x, ...) if (nargs() == 1) x else x + Recall(...)  
z <- exprTs(plus, parents=list(x=x, y=y))

Сейчас

window(z, start=1960, end=1960.75) 

дает желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...