为什么当我用 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.h
的 include
。 Rcpp Attributes 更简单(请参阅我对 CDterman 的回答的评论),它还为您添加了必需的 headers。
另请注意,pow()
被定义为标量函数(即 double
输入,double
输出),正如 CDeterman 所说,在 Rcpp 糖中(它适用于Rcpp objects 以 向量化 方式)。您可以通过显式命名空间使用来控制您使用的名称:即 std::pow()
会得到前者。
我运行使用 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.h
的 include
。 Rcpp Attributes 更简单(请参阅我对 CDterman 的回答的评论),它还为您添加了必需的 headers。
另请注意,pow()
被定义为标量函数(即 double
输入,double
输出),正如 CDeterman 所说,在 Rcpp 糖中(它适用于Rcpp objects 以 向量化 方式)。您可以通过显式命名空间使用来控制您使用的名称:即 std::pow()
会得到前者。