2012-12-14 49 views
3

下面是一個小例子:如何從Rcpp定義R函數?

require(Rcpp) 
require(inline) 

src <- ' 
Rcpp::Environment glob = Rcpp::Environment::global_env(); 
glob.assign("foo" , "function(x) x + 1"); 
' 

myFun <- cxxfunction(body=src,plugin = "Rcpp") 
myFun() 

foo 
[1] "function(x) x + 1" 

如果沒有意外,我得到的是一個字符變量,而不是一個功能。

+0

此外,我鼓勵你看看'?sourceCpp'和'?cppFunction'作爲'cxxfunction'的更強大的替代品。 –

回答

5

您需要通常的parse/eval組合才能將字符串轉換爲對象。

foo <- eval(parse(text = "function(x) x+1")) 
foo(1:10) 
# [1] 2 3 4 5 6 7 8 9 10 11 

Rcpp,你可以使用一個ExpressionVector

// [[Rcpp::export]] 
void fun(){ 
    ExpressionVector exp("function(x) x+1") ; 
    Function f = exp.eval(); 

    Rcpp::Environment glob = Rcpp::Environment::global_env(); 
    glob.assign("foo" , f); 
} 
+0

謝謝,ExpressionVector正是我正在尋找的 – ed82

+0

在這種情況下,請隨時'接受'答案。 –

+0

@Dirk:完成。感謝修正語法高亮。 – ed82