首页 > 解决方案 > 使用#include未能检查 R 包

问题描述

我正在用 C++ 为 R 构建一个包。如何在代码中包含库?例如,如果我使用#include <vector>向量,R 检查会失败并出现错误

> fatal error: vector: No such file or directory
> E>  #include <vector>
> E>           ^~~~~~~~
> E> compilation terminated.

如另一个答案中所述,我已尝试LinkingTo: vector在说明文件中使用,但它不起作用。

标签: c++rrcppr-package

解决方案


最近添加的题为“使用外部库创建 R 包的 13 个简单步骤”的小插图涵盖了您所要求的主题。

非常广泛地,可以有三种类型的带有外部库的包:

  • 仅标头,这很容易,因为您只需要处理-I...标志
  • 嵌入式,这很容易,因为库可以包含在包中
  • 外部用于可能较大的库,这是最难的变体

外部库是最难的,因为 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的更多详细信息,请参阅Rcpp 简介。

PS 对于 Rcpp 类型,它只是

R> Rcpp::cppFunction("IntegerVector doubleMe(IntegerVector x) { return x+x; }")
R> doubleMe(2:4)
[1] 4 6 8
R> 

PPS 当然,你也可以在没有 Rcpp的情况下完成所有这些操作,如何做到这一点在(在这种情况下为必读)编写 R 扩展手册中有描述。在我的谈话页面上,我有几个(较旧的)教程的链接,这些教程从十年前开始,其中显示了示例。因为这实际上很麻烦,所以我会推荐 Rcpp。


推荐阅读