我正在查看 3.6 of the Rcpp-FAQ 中提供的演示,并且我正在尝试了解如何创建此插件。提供的独立示例是
gslrng <-
'int seed = Rcpp::as<int>(par) ;
gsl_rng_env_setup();
gsl_rng *r = gsl_rng_alloc (gsl_rng_default);
gsl_rng_set (r, (unsigned long) seed);
double v = gsl_rng_get (r);
gsl_rng_free(r);return Rcpp::wrap(v);'
plug <- Rcpp:::Rcpp.plugin.maker(
include.before = "#include <gsl/gsl_rng.h>",
libs = paste("-L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp",
"-Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib",
"-L/usr/lib -lgsl -lgslcblas -lm"))
registerPlugin("gslDemo", plug )
fun <- cxxfunction(signature(par="numeric"), gslrng, plugin="gslDemo")
fun(0)
具体来说,为什么对 paste()
的调用是这样用逗号分隔的?是否应该通过插件处理所有 依赖项(头文件目录、链接器目录和库文件的名称)?
最佳答案
paste()
是基础 R 的 paste()
的普通用法——它创建一个单个 字符串,其中包含所有 链接指令被传递给 libs
。
对于 include.before
我们不需要它,因为只传递了一个 header 。
我建议您研究代码及其使用以及定义为here 的RcppGSL 的实际插件并查看它们如何在诸如 e.g. RcppZiggurat
之类的包中使用。我所说的使用是指在客户端包编译和链接时查看说明扩展到什么。
它看起来非常复杂,但嘿,它已经工作了大约十年:)
关于c++ - 了解 Rcpp 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56878616/