c++ - 使用#include未能检查 R 包
问题描述
我正在用 C++ 为 R 构建一个包。如何在代码中包含库?例如,如果我使用#include <vector>
向量,R 检查会失败并出现错误
> fatal error: vector: No such file or directory
> E> #include <vector>
> E> ^~~~~~~~
> E> compilation terminated.
如另一个答案中所述,我已尝试LinkingTo: vector
在说明文件中使用,但它不起作用。
解决方案
最近添加的题为“使用外部库创建 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。
推荐阅读
- java - 创建聚合管道时,AccumulatorOperators Max 出现问题
- linux - 在 ODI 中从另一台机器导入场景 xml
- android - 菜单未在右侧对齐
- ruby-on-rails - 授权用户在不使用 Pundit 的情况下为每个控制器执行各种 CRUD 操作;Ruby on Rails
- post - 带有字符串格式的 protobuf post rpc 方法
- ios - 无法将 UILabel 连接到 ViewController
- ios - 渐变半圆
- jooq - 是否有一个 jOOQ 工具来验证生成的定义是否仍然正确?
- c# - 如何从事件驱动架构中错过的集成或通知事件中恢复?
- google-apps-script - Google Sheets onEdit 计算