【问题标题】:Understanding Rcpp plugins了解 Rcpp 插件
【发布时间】:2019-07-03 22:23:38
【问题描述】:

我正在查看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() 的调用是以逗号分隔的? 所有依赖项(头文件目录、链接器目录和库文件的名称)是否应该通过插件处理?

【问题讨论】:

  • 这是my previous answer 的后续问题吗?在这种情况下,如果您告诉我们您要实现的目标可能是有意义的。关于paste的问题是基本的R,而第二个问题比较模糊。
  • @RalfStubner 确实如此! (感谢您的帮助)。我的最终目标是帮助不喜欢 c++ 的统计学家使用c++ library I wrote。我得到了粘贴,是 commas 把我扔了。
  • 好的。现在我明白你的意思是哪个逗号了。我没有仔细查看您的库,但是用户是否有必要编写 C++ 代码,或者库的所有功能是否可以作为 R 函数公开?在后一种情况下,您不需要 Rcpp 插件。只需将库包含在 R 包中,并使用 Rcpp 在 R 和库之间进行接口。
  • @RalfStubner 不幸的是,他们需要为每个模型/过滤器对编写一个 c++ 标头(类似于this 每次更改模型或从不同的过滤器继承时都需要重新进行编译.
  • 你能像 RcppEigen 或 RcppAramdillo 那样制作只有库头的库吗?这会大大简化事情。

标签: c++ r dependencies rcpp


【解决方案1】:

paste() 是基本 R 的 paste() 的普通用法——它创建了一个 single 字符串,其中包含 all 传递给 libs 的链接指令。

对于include.before,我们不需要它,因为只传递了一个标头。

我建议您研究代码及其用法以及定义为hereRcppGSL 实际插件,看看它们是如何在包中使用的例如例如RcppZiggurat。通过使用,我的意思是查看当客户端包编译和链接时指令扩展为什么。

它看起来非常复杂,但它已经工作了大约十年了 :)

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多