3

次のコードを取得して、knitr チャンクに変換しようとしています (Rcpp の例から借用)。

library(Rcpp)
library(inline)

openMPCode <- '
   std::vector<double> x = Rcpp::as<std::vector< double > >(xs);
   size_t n = x.size();
   #pragma omp parallel for shared(x, n)
   for (size_t i=0; i<n; i++) {
     x[i] = ::log(x[i]);
   }
   return Rcpp::wrap(x);
'

## modify the plugin for Rcpp to support OpenMP
settings <- getPlugin("Rcpp")
settings$env$PKG_CXXFLAGS <- paste('-fopenmp', settings$env$PKG_CXXFLAGS)
settings$env$PKG_LIBS <- paste('-fopenmp -lgomp', settings$env$PKG_LIBS)
funOpenMP <- rcpp(signature(xs="numeric"), body=openMPCode, settings=settings)

基本的に、主な問題は、コードがコンパイルされたときにPKG_LIBSとが適切に設定されるように、環境が Knitr チャンクに確実に渡されるようにすることです。チャンクがどのように見えるPKG_CXXFLAGSかの例:knitr

```{r engine='Rcpp'}
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector openmp_log( NumericVector x ) {
  size_t n = x.size();
  #pragma omp parallel for
  for( size_t i=0; i < n; i++ ) {
    x[i] = ::log10( x[i] );
  }
  return x;
}
```

私の理解が正しければ、knitr はチャンク内のすべてを使用してコンパイルし、で指定されたsourceCppオプションを に渡します。したがって、次の 2 つの方法が考えられます。engine.optssourceCpp

  1. engine.opts=list(env=...)適切な環境が渡されるように設定します。ただし、これを実行しようとするとエラーが発生します (複数の実引数と一致する仮引数 "env")。

  2. フック/カスタムチャンクオプションを使用して環境を設定できますが、これを正確に行う方法がわかりません。

これはknitr 1.0.11とRcpp 0.10.2です。

4

2 に答える 2

3

Rcppユーザーがカスタム環境をエンジンに渡すことに気づかなかったので、デフォルトの環境をのenv引数に渡しましたsourceCpp()。今、私は制限を取り除きました。開発バージョンはGithubにインストールできます。

PKG_LIBSダークが言及したのは、ここでは別の問題であるはずです。

于 2013-02-15T05:41:36.337 に答える
1

PKG_LIBSたまたま、処理にバグがあることに気付きました。試行ではなく上書きです。したがって、これは現在 Rcpp 属性では機能しないのではないかと心配しています。

パッケージの使用に切り替えるか、コンパイルなどのフラグを別の場所に設定することができます。

編集 2 月 16 日これは SVN で修正されました。

于 2013-02-14T20:17:19.147 に答える