2013-10-28 43 views
0

我在構建一個R函數,要求expression的大小根據另一個變量的大小而變化。構建可變長度表達式(宏中的R?)

表達元件的序列如下:

1/ 1 
2/ "Xts_filled[(locNAs[n] - 1),]" 
3/ "Xts_filled[(locNAs[n] - 2),]" 
4/ "Xts_filled[(locNAs[n] - 3),]" 
... 

表達式具有規則圖案,只有減去變更後的號碼作爲被加到每個元素:它似乎完美候選某種macro

這可能性在R

我使用for循環和eval(parse(text = ___))成語如下黑客攻擊:

buildExpr <- function(ARorder){ 
    callList <- list("1", "Xts_filled[(locNAs[n] - 1),]") 
    if(ARorder - 1) { 
     for(j in 2:ARorder) { 
      callList <- c(callList, paste0("Xts_filled[(locNAs[n] -", j, "),]")) 
     } 
    } 
    callExpr <- paste0("c(", paste(callList, collapse = ","), ")") 
} 

我把通過eval(parse(text = buildExpr(3)))工作。

有沒有更好的方法?

+1

爲什麼與'EVAL打擾(parse'?爲什麼不直接調用呢? –

+0

@RicardoSaporta我所需要的對象,以評價類似'c(1,0.5,0.25)'。這樣做讓它工作 - 儘管我不確定這是否是最好的方法。 – ricardo

+0

請參閱下面的Hong Ooi的答案;) –

回答

2

直接調用它。

out <- c(1, sapply(1:3, function(i) Xts_filled[locNAs[n] - i, ])) 

如果Xts_filled[locNAs[n], ]爲1,則簡化爲

​​
+0

+1,接受。謝謝,非常整潔的解決方案。出於某種原因,我不想評估並通過結果。我仍然對'macro'問題感興趣 - 它們在R中是否需要/有用? – ricardo