0

Rスクリプトを実行できるC++プログラムを作成することに興味があります。いくつかの設計上の理由から、RInsideのインスタンスを作成し、スクリプトを実行し、結果を取得して、インスタンスを破棄したいと思います。すべてスレッド内。Rはマルチスレッドではなく、RInsideの複数のインスタンスを作成できないことを知っています。しかし、分離されたスレッド内に単一のインスタンスを作成できますか?これを実行しようとすると、コードはコンパイルされますが、実行時に次のエラーが発生します。

Error: C stack usage is too close to the limit
Error: C stack usage is too close to the limit
terminate called after throwing an instance of 'Rcpp::binding_not_found'
  what():  binding not found: '.AutoloadEnv'
Aborted

エラーが発生したコードは次のとおりです。

#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <RInside.h>

void *thread_main(void *args){

   RInside R(0,NULL);

   /* hope to execute an R script here */

   printf("--printing from thread--\n");

   return NULL;
}

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

   pthread_t tid; 
   if( pthread_create(&tid, NULL, thread_main, NULL) ){
      printf("failed to create thread\n");
      return -1;
   } 

   sleep(1); 

   return 0;
}

R_CStackLimit = (uintptr_t)-1R拡張機能の作成で推奨されているように設定しようとしましたが、役に立ちませんでした。

私はubuntu、Rバージョン2.15.2、RInsideバージョン0.2.10を実行しています。

これを達成することは可能ですか?または私はRserveのようなことを学ぶ必要がありますか?どうもありがとう!

4

1 に答える 1

0

R はシングルスレッドであり、今後もそうあり続けるでしょう。RInside は、シングルトンとして作成されることを保証するためにある程度の時間を費やします。上記のエラーが発生することを覆すと。同じ実行可能ファイル内では、RInside インスタンスを 1 つしか取得できないため、スレッドごとに 1 つでは機能しません。あなたが経験したように。

Qt や Web アプリケーション用の Wt ライブラリなどのマルチスレッド フロントエンドを使用する場合にシングルスレッド バックエンドに対処する方法については、ソースに含まれている例を参照してください。

長期的には、Rserve のように fork できるようになるかもしれません。コードの貢献は大歓迎ですが、おそらくこれに取り組む時間はありません。

于 2013-02-11T22:00:16.553 に答える