使用 #include <vector> 无法检查 R 包
Using #include <vector> fails checking R package
我正在用 C++ 为 R 构建一个包。如何在代码中包含库?例如,如果我使用 #include <vector>
向量,R 检查失败并出现错误
> fatal error: vector: No such file or directory
> E> #include <vector>
> E> ^~~~~~~~
> E> compilation terminated.
我已经尝试在 DESCRIPTION 文件中使用 LinkingTo: vector
,如另一个答案中所述,但它不起作用。
我猜你正在使用 Rcpp
包。看看 Rcpp vignette. Also the official Writing R Extensions 手册在这里很有用,这可能是个好主意。这些包含了很多你需要的信息。
如果您只需要专门使用 vector
,或者如果您只想包含任何非标准库,则有区别。
如果您只需要使用向量,您可以在 DESCRIPTION
文件中添加 LinkingTo: Rcpp
,并在完成添加 Rcpp 所需的所有其他步骤后,C++ 文件可能如下所示来自小插图的示例:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
List rcpp_hello_world() {
CharacterVector x = CharacterVector::create("foo", "bar");
NumericVector y = NumericVector::create( 0.0, 1.0 ) ;
List z = List::create( x, y ) ;
return z ;
}
因此您可以使用例如Rcpp::NumericVector
由 Rcpp
命名空间提供。
如果您需要不同的库,这当然行不通,例如提升库。有不同的方式去/存档这个,但也有很多信息,还有有用答案的问题,例如How to build a R package which use Rcpp with external c++ libraries?
您还可以查看其他使用 Rcpp 和其他 c++ 库(例如 boost)的 R 包。 DescTools
是一个很好的例子 (Git DescTools)。
我建议您尝试按照 Rcpp vignette 中的指南正确设置 Rcpp,如果仍然失败,请在此处进行跟进,提供更详细的信息,具体是您尝试添加的库以及它失败的地方。
最近添加的标题为 Thirteen Simple Steps for Creating an R Package with an External Library 的小插图涵盖了您要询问的主题。
从广义上讲,可以有三种带有外部库的包:
- header-only,这很容易,因为您只需要处理
-I...
标志
- 嵌入式,这很容易,因为 小型 库可以包含在包中
- 外部可能是最大的库,这是最难的变体
外部库 是最难的,因为 R 非常便携的特性让您担心如何在 Windows、macOS 和不同 Linux 口味。
综上所述,此处您的问题一定更根本。我们不能说太多,因为你没有提供 MCVE 但很容易证明 Rcpp 当然 知道 STL 向量 class 在哪里(初始代码是一行,此处打断仅供说明)
R> Rcpp::cppFunction("std::vector<int> doubleMe(std::vector<int> x) { \
std::vector<int> y(x.size()); for (size_t i=0; i<x.size(); i++) \
y[i] = x[i]+x[i]; return y; }")
R> doubleMe(1:3)
[1] 2 4 6
R>
这清楚地表明 Rcpp 知道在哪里可以找到 header---所以您要么以某种非常不寻常的方式在您的计算机上安装了编译器和库或 R,要么以错误的方式调用了 R。有关 Rcpp 的更多详细信息,请参阅 A Brief Introduction to Rcpp。
PS 对于 Rcpp 类型,它只是
R> Rcpp::cppFunction("IntegerVector doubleMe(IntegerVector x) { return x+x; }")
R> doubleMe(2:4)
[1] 4 6 8
R>
PPS 当然你也可以在没有 Rcpp 的情况下完成所有这些 并且如何做到这一点在(本例中的必读)Writing R Extensions manual. On my talks page 我有十多年前的几个(较旧的)教程的链接,这些教程显示了示例。因为这个 实际上很麻烦 我会推荐 Rcpp。
我正在用 C++ 为 R 构建一个包。如何在代码中包含库?例如,如果我使用 #include <vector>
向量,R 检查失败并出现错误
> fatal error: vector: No such file or directory
> E> #include <vector>
> E> ^~~~~~~~
> E> compilation terminated.
我已经尝试在 DESCRIPTION 文件中使用 LinkingTo: vector
,如另一个答案中所述,但它不起作用。
我猜你正在使用 Rcpp
包。看看 Rcpp vignette. Also the official Writing R Extensions 手册在这里很有用,这可能是个好主意。这些包含了很多你需要的信息。
如果您只需要专门使用 vector
,或者如果您只想包含任何非标准库,则有区别。
如果您只需要使用向量,您可以在 DESCRIPTION
文件中添加 LinkingTo: Rcpp
,并在完成添加 Rcpp 所需的所有其他步骤后,C++ 文件可能如下所示来自小插图的示例:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
List rcpp_hello_world() {
CharacterVector x = CharacterVector::create("foo", "bar");
NumericVector y = NumericVector::create( 0.0, 1.0 ) ;
List z = List::create( x, y ) ;
return z ;
}
因此您可以使用例如Rcpp::NumericVector
由 Rcpp
命名空间提供。
如果您需要不同的库,这当然行不通,例如提升库。有不同的方式去/存档这个,但也有很多信息,还有有用答案的问题,例如How to build a R package which use Rcpp with external c++ libraries?
您还可以查看其他使用 Rcpp 和其他 c++ 库(例如 boost)的 R 包。 DescTools
是一个很好的例子 (Git DescTools)。
我建议您尝试按照 Rcpp vignette 中的指南正确设置 Rcpp,如果仍然失败,请在此处进行跟进,提供更详细的信息,具体是您尝试添加的库以及它失败的地方。
最近添加的标题为 Thirteen Simple Steps for Creating an R Package with an External Library 的小插图涵盖了您要询问的主题。
从广义上讲,可以有三种带有外部库的包:
- header-only,这很容易,因为您只需要处理
-I...
标志 - 嵌入式,这很容易,因为 小型 库可以包含在包中
- 外部可能是最大的库,这是最难的变体
外部库 是最难的,因为 R 非常便携的特性让您担心如何在 Windows、macOS 和不同 Linux 口味。
综上所述,此处您的问题一定更根本。我们不能说太多,因为你没有提供 MCVE 但很容易证明 Rcpp 当然 知道 STL 向量 class 在哪里(初始代码是一行,此处打断仅供说明)
R> Rcpp::cppFunction("std::vector<int> doubleMe(std::vector<int> x) { \
std::vector<int> y(x.size()); for (size_t i=0; i<x.size(); i++) \
y[i] = x[i]+x[i]; return y; }")
R> doubleMe(1:3)
[1] 2 4 6
R>
这清楚地表明 Rcpp 知道在哪里可以找到 header---所以您要么以某种非常不寻常的方式在您的计算机上安装了编译器和库或 R,要么以错误的方式调用了 R。有关 Rcpp 的更多详细信息,请参阅 A Brief Introduction to Rcpp。
PS 对于 Rcpp 类型,它只是
R> Rcpp::cppFunction("IntegerVector doubleMe(IntegerVector x) { return x+x; }")
R> doubleMe(2:4)
[1] 4 6 8
R>
PPS 当然你也可以在没有 Rcpp 的情况下完成所有这些 并且如何做到这一点在(本例中的必读)Writing R Extensions manual. On my talks page 我有十多年前的几个(较旧的)教程的链接,这些教程显示了示例。因为这个 实际上很麻烦 我会推荐 Rcpp。