如何使用knitr将环境传递给Rcpp块?

时间:2013-02-14 19:24:50

标签: r knitr rcpp

我正在尝试使用以下代码并将其转换为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)

基本上,主要问题是确保将环境传递到knitr块,以便在编译代码时适当地设置PKG_LIBSPKG_CXXFLAGSknitr块的外观示例:

```{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对块中的任何内容进行编译,并将engine.opts中指定的选项传递给sourceCpp。因此,我想有两种可能的途径:

  1. 设置engine.opts=list(env=...)以便传递适当的环境;但是,我在尝试这个时遇到错误(正式参数“env”与多个实际参数匹配)。

  2. 可以使用钩子/自定义块选项来设置环境,但我不确定如何完成此操作。

  3. 这是针织者1.0.11和Rcpp 0.10.2。

2 个答案:

答案 0 :(得分:3)

我没有意识到用户会将自定义环境传递给Rcpp引擎,因此我将默认环境传递给env中的sourceCpp()参数。现在我have removed限制。您可以在Github上安装development version

Dirk提到的

PKG_LIBS应该是一个不同的问题。

答案 1 :(得分:1)

我们今天碰巧已经意识到PKG_LIBS治疗是错误的:覆盖而不是尝试。所以我担心目前这不适用于Rcpp属性。

您可以切换到使用包,或在其他地方设置编译等标志。

编辑2月16日现在已在SVN中修复。