gpt4 book ai didi

r - 如何使用 knit 将环境传递给 Rcpp block ?

转载 作者:行者123 更新时间:2023-12-02 02:06:04 29 4
gpt4 key购买 nike

我正在尝试使用以下代码并将其转换为knitr block (借用自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 block 中,以便在编译代码时正确设置PKG_LIBSPKG_CXXFLAGSknitr block 的示例如下:

```{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 对 block 中的任何内容使用 sourceCpp 来编译它,并将 engine.opts 中指定的选项传递给 sourceCpp >。因此,我认为有两种潜在的途径:

  1. 设置engine.opts=list(env=...)以便传递适当的环境;但是,尝试此操作时出现错误(形式参数“env”与多个实际参数匹配)。

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

这是使用knitr 1.0.11和Rcpp 0.10.2。

最佳答案

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

Dirk提到的

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

关于r - 如何使用 knit 将环境传递给 Rcpp block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882486/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com