如何解决使用#include <vector>无法检查R包
我正在用C ++构建R的软件包。如何在代码中包含库?例如,如果我使用#include <vector>
向量,则R检查失败并显示错误
> fatal error: vector: No such file or directory
> E> #include <vector>
> E> ^~~~~~~~
> E> compilation terminated.
我已尝试在DESCRIPTION文件中使用LinkingTo: vector
,如另一个答案所述,但这不起作用。
解决方法
最近添加的标题为Thirteen Simple Steps for Creating an R Package with an External Library的小插图涵盖了您要的主题。
从广义上讲,可以使用三种类型的带有外部库的软件包:
- 仅标头,这很容易,因为您只需要注意
-I...
标志 - 嵌入式,这很容易,因为软件包中可以包含 small 库
- 可能是最大库的外部库,这是最难的变体
外部库最难,因为R的可移植性使您担心如何在Windows,macOS和不同的Linux版本上使用该库进行构建。
所有这些,这里,您的问题必须更根本。我们不能多说,因为您没有提供MCVE,但是很容易证明Rcpp当然知道 在哪里STL向量类在哪里(初始代码是一行,在这里为仅限博览会)
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知道在哪里可以找到该头文件-因此,要么以某种非常不寻常的方式在计算机上安装了编译器和库,要么安装了R,或者以错误的方式调用了R。有关Rcpp的更多详细信息,请参见A Brief Introduction to Rcpp。
使用Rcpp类型的PS只是
R> Rcpp::cppFunction("IntegerVector doubleMe(IntegerVector x) { return x+x; }")
R> doubleMe(2:4)
[1] 4 6 8
R>
PPS当然,您也可以在没有Rcpp 的情况下完成所有这些操作,有关操作方法,请参见Writing R Extensions(在此情况下为必读)手册。在我的talks page上,我链接了十年以上的几个(较旧的)教程,这些教程都显示了示例。由于该实际上很麻烦,因此我建议使用Rcpp。
,我想您正在使用Rcpp
软件包。看看Rcpp vignette可能是个好主意。官方Writing R Extensions手册在这里也很有用。这些包含您需要的很多信息。
如果您只需要专门使用vector
,或者只想包含任何非标准库,就会有所不同。
如果只需要使用向量,则可以在LinkingTo: Rcpp
文件中包含DESCRIPTION
,并在完成添加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插图中的指南正确设置Rcpp,如果仍然无法通过Rcpp进行安装,请在此处提供更详细的信息,包括您要尝试添加的库以及失败的地方。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。