c++ - 从 sourceCpp 移动到带有 Rcpp 的包

标签 c++ r rcpp

我目前有一个 .cpp 文件,我可以使用 sourceCpp() 进行编译。正如预期的那样,创建了相应的 R 函数,并且代码按预期工作。

这里是:

#include <Rcpp.h> 
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector exampleOne(NumericVector vectorOne, NumericVector vectorTwo){

    NumericVector outputVector = vectorOne + vectorTwo; 

    return outputVector;
}

我现在正在使用 Rcpp 将我的项目转换为一个包。所以我用 rStudio 创建了骨架,并开始研究如何转换。

在哈德利的 excellent primer on Cpp ,他在“在包中使用 Rcpp”一节中说:

If your packages uses the Rcpp::export attribute then one additional step in the package build process is requried. The compileAttributes function scans the source files within a package for Rcpp::export attributes and generates the code required to export the functions to R.

You should re-run compileAttributes whenever functions are added, removed, or have their signatures changed. Note that if you build your package using RStudio or devtools then this step occurs automatically.

所以看起来使用 sourceCpp() 编译的代码应该可以像在包中一样工作。

我创建了相应的 R 文件。

exampleOne <- function(vectorOne, vectorTwo){
    outToR <- .Call("exampleOne", vectorOne, vectorTwo, PACKAGE ="testPackage")
    outToR
}

然后我(重新)构建了这个包,我得到了这个错误:

.Call("exampleOne", vectorOne, vectorTwo, PACKAGE = "voteR") 中的错误: C 符号名称“exampleOne”不在包“testPackage”的 DLL 中

有没有人知道在获取使用 sourceCpp() 编译的代码然后在包中使用它时我还需要做什么?

我应该注意到我已经阅读了:“Writing a package that uses Rcpp”http://cran.rstudio.com/web/packages/Rcpp/vignettes/Rcpp-package.pdf并了解那里介绍的基本结构。但是,在查看 RcppExamples 源代码后,似乎小插图中的结构与示例包中使用的结构并不完全相同。例如,没有使用 .h 文件。此外,小插图和源代码都没有使用 [[Rcpp::export]] 属性。这一切都让我很难准确找出我的错误在哪里。

最佳答案

这是我关于如何从使用 sourceCpp() 到使用 Rcpp 的包的“演练”。如果有错误,请随时编辑或让我知道,我会编辑它。

[注意:我强烈建议在此过程中使用 RStudio。]

所以你已经完成了 sourceCpp() 的工作,现在你需要构建一个包。这并不难,但可能有点棘手,因为那里有关使用 Rcpp 构建包的信息范围从您想要的任何 R 包的详尽彻底的文档(但对于新手来说,这超出了您的头顶),以及新手敏感介绍(可能会遗漏您碰巧需要的细节)。

这里我使用 oneCpp.cpptwoCpp.cpp 作为您将在包中使用的两个 .cpp 文件的名称。

这是我的建议:

A.首先,我假设您有一个版本的 theCppFile.cpp 可以使用 sourceCpp() 编译并按您的预期工作。这不是必须的,但如果您是 Rcpp OR 包的新手,最好确保您的代码在这种简单的情况下工作,然后再转到下面更复杂的情况。

B.现在使用 Rcpp.package.skeleton() 或使用 RStudio 中的 Project>Create Project>Package w/Rcpp 向导构建您的包(强烈推荐)。您可以在 hadley/devtools 中找到有关使用 Rcpp.package.skeleton() 的详细信息或 Rcpp Attributes Vignette .使用 Rcpp 编写包的完整文档位于 Writing a package that uses Rcpp ,但是这个假设你相当了解 C++ 的方式,并且不使用新的“属性”方式来执行 Rcpp。但是,如果您转向制作更复杂的软件包,这将是非常宝贵的。

您的包现在应该有一个如下所示的目录结构:

yourPackageName
- DESCRIPTION
- NAMESPACE
- \R\
    - RcppExports.R 
- Read-and-delete-me
- \man\
    - yourPackageName-package.Rd
- \src\
    - Makevars
    - Makevars.win
    - oneCpp.cpp 
    - twoCpp.cpp
    - RcppExports.cpp

一切都设置好后,如果使用 RStudio,请执行“构建和重新加载”,如果您不在 RStudio 中,请执行 compileAttributes()

C.您现在应该在 \R 目录中看到一个名为 RcppExports.R 的文件。打开它并检查一下。在 RcppExports.R 中,您应该看到 \src 目录中所有 .cpp 文件的 R 包装函数。很甜蜜,嗯?。

D) 尝试与您在 theCppFile.cpp 中编写的函数相对应的 R 函数。它有效吗?如果是这样,请继续。

E) 您现在可以在创建时将新的 .cpp 文件(如 otherCpp.cpp)添加到 \src 目录中。然后你只需要重建包,R 包装器就会为你生成并添加到 RcppExports.R 中。在 RStudio 中,这只是 Build 菜单中的“Build & Reload”。如果你没有使用 RStudio,你应该运行 compileAttributes()

关于c++ - 从 sourceCpp 移动到带有 Rcpp 的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14288254/

相关文章:

r - 如何在ggplot2中为hline添加图例

使用 openmp 的 Rcpp

c++ - 如何删除 "completely"链表中的所有节点?

c++ - %[^\n] 在 scanf() 格式字符串中是什么意思

html - 解析xml属性: strange Encoding issue

r - 如何自动更新R到最新版本?

r - 在 Rcpp Armadillo 中将 S4 对象转换为矩阵类型

r - 使用XMPP协议(protocol)通过R发送Google Talk和Facebook消息

c++ - 验证基本矩阵

c++ - 无法在我的程序中获得所需的输出