-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);
}
返信いただきありがとうございます。私はRInsideを使用したいと思います(先日、Windowsマシンでうまく動作していました)が、商用目的ではうまくいきません。したがって、私は文字列の入力だけで動作するより軽いものを書くことを試みてきました。しかし、Rがメイン関数からではなく、関数呼び出しごとにインスタンス化されるので、このロードブロッキングを実行しています。 – clearner
RInside(およびRcppと...)はすべてRと同じライセンスの下にあります。あなたがRInside(またはRcppまたは...)を使うことができないと思うなら、あなたは** R **を使うこともできません。 –
私の欠陥はライセンスを見ていませんでした。私はRInsideを実行していますが、mainの代わりにRInsideを別の関数でインスタンス化するとき、上記と同じエラーが発生します。コンパイルされますが、2つの関数呼び出しがあるとオブジェクトファイルが停止します。 – clearner