为什么当我用Rcpp编写时,我不需要包含一些我应该包含在纯C ++中编写的库?

时间:2015-01-22 16:46:37

标签: c++ r include rcpp

我使用Rcpp运行以下代码

src <- '
Rcpp::NumericVector vec(vx);
double p = Rcpp::as<double>(dd);
double sum = 0.0;
for (int i=0; i<vec.size(); i++) {
sum += pow(vec[i], p);
}
return Rcpp::wrap(sum);
'

fun <- cxxfunction(signature(vx="numeric", dd="numeric"),
src, plugin="Rcpp")

fun(1:4,2)

我得到了结果30(这是正确的)。如果我在普通C ++中运行函数pow(x,y),我需要添加

#include <math>

为什么我不需要在Rcpp下写作?

2 个答案:

答案 0 :(得分:3)

以狭隘的方式回答你的问题:

  • 因为您的#include <Rcpp.h>导致其他标题包含在您身上

因为Rcpp.h包含了它们(以及Josh为了这个而设置好的技巧;我仍然在命令行中这样做)。您使用包inline中较早的cxxfunction(),为include添加了Rcpp.h。 Rcpp属性更容易(请参阅我对CDterman答案的评论),它还为您添加了所需的标题。

另请注意,pow()被定义为标量函数(即double in,double out),正如CDeterman所说,在Rcpp糖中(它适用于Rcpp对象)以矢量化方式)。您可以通过显式命名空间使用来控制您使用的内容:即std::pow()将获得前者。

答案 1 :(得分:2)

当您在R对象上使用它时,pow函数是Rcpp Sugar的一部分。我不认为数学库中的每个函数都已转换,所以不要期望每个函数都能在R对象上运行。您可以看到小插图here详细介绍了一些已实现的功能。

现在,如果您想知道为什么在普通C ++对象上使用pow时不需要数学库,例如这个非常简单的例子:

src <- '
double t = 2;
double o = pow(t, 2);
return wrap(o);
'

fun <- cxxfunction(signature(),
                   src, plugin="Rcpp")
fun()
[1] 4

这是因为您怀疑Rcpp确实默认导入标头。标题列表显示在源代码中。您感兴趣的文件可能是this,您可以在其中看到包含cmath库。大多数基本C ++标头似乎位于here

也就是说,您可能会觉得浏览源代码很乏味,而Josh建议的调用对于快速查看库来说真的很特别,但您也应该知道信息实际来自哪里而不是一次通话的魔力,恕我直言。