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

Why when I write with Rcpp I do not need to include some libraries which I should include writing in plain C++?

我运行使用 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 下编写?

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

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

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

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

这是因为 Rcpp 确实像您怀疑的那样默认导入了 headers。 headers 的列表显示在源代码中。您感兴趣的文件可能是 this where you will see that the cmath library is included. Most of the base C++ headers seem to be located here

尽管如此,您可能会发现浏览源代码很乏味,Josh 建议的调用对于快速查看库来说确实很特别,但您还应该了解信息的实际来源恕我直言,而不是单个电话的魔力。

狭义地回答你的问题:

  • 因为您的 #include <Rcpp.h> 导致其他 headers 被收录给您

因为 Rcpp.h 包含它们供您使用(Josh 的 grep 技巧很不错;我仍然会在 command-line 上这样做)。您使用软件包 inline 中较旧的 cxxfunction(),它会为您添加 Rcpp.hinclude。 Rcpp Attributes 更简单(请参阅我对 CDterman 的回答的评论),它还为您添加了必需的 headers。

另请注意,pow() 被定义为标量函数(即 double 输入,double 输出),正如 CDeterman 所说,在 Rcpp 糖中(它适用于Rcpp objects 以 向量化 方式)。您可以通过显式命名空间使用来控制您使用的名称:即 std::pow() 会得到前者。