c++ - 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 中按照以下步骤操作:
- 创建新项目/包
- 包含这个 cpp 源文件作为这个包的源文件
include
rcpp并输入Rcpp.package.skeleton("mypackage")
至今,包文件夹中没有DLL- 尝试通过转到构建/安装和重新启动在 RStudio 中构建包,但随后我收到一条错误消息“构建 R 包需要安装其他构建工具,你想安装它们吗?” 但是我已经安装了 RbuildTools 3.4,当我在 RStudio 中单击“是”时,没有任何反应。
PS:很高兴听到其他方法,但如果可能,应该使用 DLL 格式。非常感谢任何信息,因为我基本上不知道 Rcpp 或 C++ 是如何工作的
解决方案
你需要弄清楚为什么你的设置被软管。这意味着很容易而且很容易。手表:
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); \
} ')
推荐阅读
- youtube-iframe-api - Youtube iframe api:与 MediaSession 交互
- c# - 将 .net core 应用程序作为 Windows 应用程序运行并在 Windows 启动时启动
- android - 如何在 Android 上使用透明 webm?
- excel - 如何通过 JavaScript API 调整 Excel 中表格的大小?
- mysql - 从两个表中选择计数 = SQL 中的乘法?
- javascript - React Router 在通过导航重定向后不会加载新的页面组件
- ubuntu - cd 没有这样的文件或目录。也 cd 权限被拒绝
- c# - 从 IActionResult 响应中删除空值
- react-native - 在本机反应中有条件地渲染标题
- http2 - Kong - 通过 HTTP/2 连接到上游