我使用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下写作?
答案 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建议的调用对于快速查看库来说真的很特别,但您也应该知道信息实际来自哪里而不是一次通话的魔力,恕我直言。