2016-08-15 6 views
-1

Rコールを受け取り評価するC++関数を作成しています。関数を呼び出すたびにコンパイルされるたびに、関数は期待どおりに戻ります。 しかし、私の関数へのサブシーケンシャルな呼び出しがあるとき、オブジェクトファイルを実行すると止まってしまいます。RへのサブシーケンシャルCコールが機能しません

1回の関数呼び出しの後にRインスタンスを再インスタンス化するにはどうすればよいですか? 私の関数への呼び出しが2回あっても1つの呼び出しを行うとうまく動作すると、以下のメソッドが停止します。

int main(int argc, char* argv[]){ 

double result1 = calculateScalar(input2); 
std::cout << "Result 1 " << result1; 


double result2 = calculateScalar(input2); 
std::cout << "Result 2 " <<result2; 
return 0; 
} 


double calculateScalar(const char* RCALL){ 
    SEXP formula, result; 
    ParseStatus status; 
    R_xlen_t len; 
    int errorStatus; 

    try { 
     Rf_initEmbeddedR(0, NULL); 

     Rf_protect(formula = mkString(RCALL)); 

     Rf_protect(formula = R_ParseVector(formula, 1, &status, R_NilValue)); 



     result = R_tryEval(VECTOR_ELT(formula,0), R_GlobalEnv, &errorStatus); 
     PROTECT(result); 

     len = xlength(result); 


     UNPROTECT(3); 
     Rf_endEmbeddedR(0); 
     return (double) getNumericScalar(result); 

} catch(std::exception& e){ 
    std::cout << "Standard exception: " << e.what(); 
} 

//Clean up R 
Rf_endEmbeddedR(0); 
exit(0); 
} 

答えて

2

の代わりに車輪の再発明、あなたは可能性だけRInside:

[email protected]:~/git/rinside/inst/examples/standard(master)$ make rinside_sample3 
ccache g++ -I/usr/share/R/include -I/usr/local/lib/R/site-library/Rcpp/include \ 
-I/usr/local/lib/R/site-library/RInside/include -g -O3 -Wall -pipe -Wno-unused \ 
-pedantic -Wall rinside_sample3.cpp -Wl,--export-dynamic -fopenmp\ 
-L/usr/lib/R/lib -lR -lpcre -llzma -lbz2 -lz -lrt -ldl -lm \ 
-lblas -llapack -L/usr/local/lib/R/site-library/RInside/lib -lRInside \ 
-Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib -o rinside_sample3 
[email protected]:~/git/rinside/inst/examples/standard(master)$ 

this simple source fileから(自動的に自動化された `たGNUmakefileを使用して)、それを構築します。それを実行

が得られます。

[email protected]:~/git/rinside/inst/examples/standard(master)$ ./rinside_sample3 

Call: 
lm(formula = Fertility ~ ., data = swiss) 

Residuals: 
    Min  1Q Median  3Q  Max 
-15.2743 -5.2617 0.5032 4.1198 15.3213 

Coefficients: 
       Estimate Std. Error t value Pr(>|t|)  
(Intercept)  66.91518 10.70604 6.250 1.91e-07 *** 
Agriculture  -0.17211 0.07030 -2.448 0.01873 * 
Examination  -0.25801 0.25388 -1.016 0.31546  
Education  -0.87094 0.18303 -4.758 2.43e-05 *** 
Catholic   0.10412 0.03526 2.953 0.00519 ** 
Infant.Mortality 1.07705 0.38172 2.822 0.00734 ** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 7.165 on 41 degrees of freedom 
Multiple R-squared: 0.7067, Adjusted R-squared: 0.671 
F-statistic: 19.76 on 5 and 41 DF, p-value: 5.594e-10 



And now from C++ 

         Estimate  Std. Error   t value  Pr(>|t|) 
    (Intercept)  66.9152   10.706   6.25023  1.90605e-07 
    Agriculture  -0.172114  0.0703039  -2.44814  0.0187272 
    Examination  -0.258008  0.253878  -1.01627  0.315462 
     Education  -0.87094  0.183029  -4.75849  2.4306e-05 
     Catholic  0.104115  0.0352579   2.95297  0.00519008 
Infant.Mortality  1.07705   0.38172   2.82157  0.00733572 

[email protected]:~/git/rinside/inst/examples/standard(master)$ 

注意すべきいくつかのこと:

  • それがCで複数のeval...()のコールが含まれているように私は(パッケージ内の他の文字通り何十間)この例を選んだの++コード。
  • lm()あなたのためにそれをやり直すのもかわいいです。
  • make rinside_sample3の実際のコンパイルは、システムによって異なります。私の中には、私が設定したいくつかのパラメータが反映されています~/.R/Makevars
  • 私は手動でディスプレイを4つのスペースで狭めてフィットさせています。
+0

返信いただきありがとうございます。私はRInsideを使用したいと思います(先日、Windowsマシンでうまく動作していました)が、商用目的ではうまくいきません。したがって、私は文字列の入力だけで動作するより軽いものを書くことを試みてきました。しかし、Rがメイン関数からではなく、関数呼び出しごとにインスタンス化されるので、このロードブロッキングを実行しています。 – clearner

+3

RInside(およびRcppと...)はすべてRと同じライセンスの下にあります。あなたがRInside(またはRcppまたは...)を使うことができないと思うなら、あなたは** R **を使うこともできません。 –

+0

私の欠陥はライセンスを見ていませんでした。私はRInsideを実行していますが、mainの代わりにRInsideを別の関数でインスタンス化するとき、上記と同じエラーが発生します。コンパイルされますが、2つの関数呼び出しがあるとオブジェクトファイルが停止します。 – clearner

関連する問題