首页 > 解决方案 > Rcpp,使函数可以从 DLL 中用于 R

问题描述

C++ 新手,我想让在 R 中可用的 DLL 中编译的函数。

到目前为止,通过在 VisualStudio 中执行这些步骤,然后使用from R 加载创建的 dll ,我设法为一个以integer输入为输入并返回相同的基本函数做到了这一点。dyn.load

但是,我的 C++ 函数需要处理 Rdata.frame对象,我不确定如何实现。我从Rcpp 库中看到Rcpp可能包含 R 和 c++ 数据类型(包括对象)之间的某种转换data.frame,但我不知道是否可以使用生成 dll 的 dll Rcpp,然后使用dyn.load.

Dirk Eddelbuettel 的这个回答来看,似乎可以使用 生成“动态库” Rcpp,但是,当我尝试.cpp使用rcpp.package.skeleton(). 我想要一个 dll 的功能来自Rcpp 库

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame modifyDataFrame(DataFrame df) {
  // access the columns
  IntegerVector a = df["a"];
  CharacterVector b = df["b"];

  // make some changes
  a[2] = 42;
  b[1] = "foo";       
  // return a new data frame
  return DataFrame::create(_["a"]= a, _["b"]= b);
}

我试图将该代码粘贴到 VisualStudio 中以尝试生成该 DLL,但是我遇到了我非常期望的错误“找不到 Rcpp.h”。

然后我在 RStudio 中按照以下步骤操作:

  1. 创建新项目/包
  2. 包含这个 cpp 源文件作为这个包的源文件
  3. includercpp并输入Rcpp.package.skeleton("mypackage")至今,包文件夹中没有DLL
  4. 尝试通过转到构建/安装和重新启动在 RStudio 中构建包,但随后我收到一条错误消息“构建 R 包需要安装其他构建工具,你想安装它们吗?” 但是我已经安装了 RbuildTools 3.4,当我在 RStudio 中单击“是”时,没有任何反应。

PS:很高兴听到其他方法,但如果可能,应该使用 DLL 格式。非常感谢任何信息,因为我基本上不知道 Rcpp 或 C++ 是如何工作的

标签: c++rrcpp

解决方案


你需要弄清楚为什么你的设置被软管。这意味着很容易而且很容易。手表:

R> Rcpp::cppFunction('DataFrame modDF(DataFrame df) { IntegerVector a = df["a"]; CharacterVector b = df["b"]; a[2] = 42; b[1] = "foo"; return DataFrame::create(Named("a")=a, Named("b")=b); } ')                  
R> df <- data.frame(a=1:3, b=letters[24:26])                                                                                                                                                                       
R> df                                                                                                                                                                                                              
  a b                                                                                                                                                                                                              
1 1 x                                                                                                                                                                                                              
2 2 y                                                                                                                                                                                                              
3 3 z                                                                                                                                                                                                              
R> modDF(df)                                                                                                                                                                                                       
   a   b                                                                                                                                                                                                           
1  1   x                                                                                                                                                                                                           
2  2 foo                                                                                                                                                                                                           
3 42   z                                                                                                                                                                                                           
R>      

现在,我显然不建议用这种方式写一篇很长的单行。您已经在正确的轨道上设置一个包。但是你需要弄清楚是什么阻碍了你的工具。

作为 PS,上面的单行具有更好的缩进:

R> Rcpp::cppFunction('DataFrame modDF(DataFrame df) { \
      IntegerVector a = df["a"]; \
      CharacterVector b = df["b"]; \
      a[2] = 42;  \
      b[1] = "foo"; \ 
      return DataFrame::create(Named("a")=a, Named("b")=b); \
    } ')                  

推荐阅读