将 R 对象传递给 Rust 程序需要哪些步骤?

2024-02-26

R和Rust都可以与C代码交互,所以我认为这是很有可能的。然而,我有点不清楚如何继续。

我已阅读这些部分来寻找答案:

  1. R 扩展系统和外语接口 http://cran.r-project.org/doc/manuals/r-release/R-exts.html#System-and-foreign-language-interfaces
  2. Rust 外部函数接口指南 http://doc.rust-lang.org/0.11.0/guide-ffi.html

但是虽然我很精通R I am not一名系统程序员,对这种努力的构建链是什么样子感到困惑。

Using Rinternals.h会很理想,但我会选择更简单的.C接口也是如此。


我也为此苦苦挣扎了一段时间,但一旦你知道了它实际上并不那么困难。

首先按照以下说明创建 Rust 库:其他语言中的 rust https://doc.rust-lang.org/stable/book/rust-inside-other-languages.html。 这是一个 Rust 库示例:

//src/lib.rs

#[no_mangle]
pub fn kelvin_to_fahrenheit(n: f64) -> f64 {
    n * 9.0/5.0 - 459.67
}

如果您按照中的说明进行操作其他语言中的 rust https://doc.rust-lang.org/stable/book/rust-inside-other-languages.html,那么你应该能够生成一个*.so (or *.dll or .dylib,取决于您的系统)。我们假设这个编译后的文件名为libtempr.so.

现在创建一个 C++ 文件,它将把您需要的函数传递给 R:

//embed.cpp

extern "C" {
    double kelvin_to_fahrenheit(double);
}

// [[Rcpp::export]]
double cpp_kelvin_to_fahrenheit(double k) {
  double f = kelvin_to_fahrenheit(k);
  return(f);
}

现在,在启动 R 之前,请确保环境变量LD_LIBRARY_PATH包含先前生成的共享对象的目录(libtempr.so) 被储存了。在外壳中执行以下操作:

$ export LD_LIBRARY_PATH=/home/sam/path/to/shared/object:$LD_LIBRARY_PATH
$ rstudio # I highly recommend using Rstudio for your R coding

最后在Rstudio中写入这个文件:

library(Rcpp)

Sys.setenv("PKG_LIBS"="-L/home/sam/path/to/shared/object -ltempr")

sourceCpp("/home/sam/path/to/embed.cpp", verbose = T, rebuild = T)

cpp_kelvin_to_fahrenheit(300)
  • 请注意,在Sys.setenv the -L选项指向包含 Rust 共享对象的目录。
  • 还要注意的是-l选项是您的共享对象的名称,不带lib前缀并且没有.so(或者你系统上的任何东西)postfix。
  • Using Sys.setenv在 R 中设置LD_LIBRARY_PATH多变的不起作用。在启动 R 之前导出变量。
  • The verbose那里有选项,这样你就可以看到什么Rcpp编译你的C++文件。注意其中的选项PKG_LIBS以上用于编译 C++ 文件。
  • The rebuildoptions 可以在每次运行这行 R 代码时强制重建 C++ 文件。

如果一切顺利,然后在交互式控制台中运行上面的 R 文件,它应该输出80.33当你到达最后一行时。

如果有任何不清楚的地方,请在评论中提问,我会尽力改进我的答案。

希望它有帮助:)


最后一点,基本功能dyn.load and .C可以用作替代方法。但这需要编写比这种方法更多的样板包装代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 R 对象传递给 Rust 程序需要哪些步骤? 的相关文章

  • 如何在Shiny中默认选择verbatimTextOutput中的文本?

    这是与我之前的问题相关的问题 是否可以有固定宽度的 verbatimTextOutput 并让文本在 Shiny 中换行 https stackoverflow com q 58516071 7669809 我有以下闪亮的应用程序 http
  • 按月/年间隔汇总每日数据

    我并不经常需要在 R 中处理日期 但我认为这相当简单 我有一列代表数据框中的日期 我只想创建一个新的数据框 使用日期按月 年总结第二列 最好的方法是什么 我想要第二个数据框 这样我就可以将它提供给绘图 您能提供的任何帮助将不胜感激 编辑 供
  • R Markdown / Bookdown 中的水平规则导致错误

    突然 我在 Markdown Bookdown 中编织为 PDF 时遇到错误 我的系统没有任何变化 该错误是由 水平规则 引起的 即 Markdown 中的任意位置 或 尽管两侧都有行空格 我提供了一个简单的违规示例 它不会合并成 PDF
  • 使用 RSQLite 在 R 中加载 SQLite 表

    我有这个函数用来加载 SQLite 表 sqLiteConnect lt function database table library DBI library RSQLite con lt dbConnect SQLite dbname
  • Foreach循环无法找到对象

    我正在尝试将 foreach 与并行后端结合使用来加速计算 用于特征选择的 AUCRF 随机森林的交叉验证 如果这确实重要的话 在这样做的过程中 我需要获取向量的子集 向量的名称可以更改 但可以作为字符向量进行访问 我使用 eval par
  • 将异步函数包装在结构中时的生命周期

    我正在尝试将异步函数包装在结构中 例如 use std future Future struct X struct Y async fn f x X gt Y Y struct MyStruct
  • dplyr 标准评估:summarise_ 以及求和变量的变量名称

    我遇到了很多与我的问题类似的问题 但只解决了我问题的一部分 我使用带有标准评估的 dplyr 来容纳变量名称 这对于管道中的 filter 和 group by 效果很好 但是 为了总结 我无法为我正在求和的指标提供变量名称 一个例子就可以
  • R strsplit 问题(容易解决吗?)

    这应该是一件很容易做到的事情 我在这里读到的类似示例有点复杂 而且这些技术对我来说并不真正有效 我有一个名为 id string 的变量 gt typeof id string 1 character and gt id string 1
  • 添加带有错误的弹出窗口,警告闪亮

    有什么办法可以添加一个popup 可关闭的窗口 其中包含警告或其他消息Shiny 我用来构建 Web 应用程序的 R 包 我已经寻找了一段时间但没有任何结果 虽然我不认为有任何本地可用的东西shiny 你可以尝试添加jQueryUI到您的应
  • 在 mts 对象上使用 Apply 系列函数

    在 mts 对象上使用 apply 或 sapply 会在发送到函数时删除其时间序列属性 我应该如何在 mts 对象中的每个时间序列上应用相同的函数 带有 ts 输入和 ts 输出 并返回它 最好是 mts 我的意思是除了使用 for 循环
  • R:错误消息---包错误:“functionName”未从当前命名空间解析

    我正在使用一个一直运行到 R3 0 的软件包 问题如上所述 当我们调用在 R 2 15 2 中工作的函数时 从 R 3 0 开始我们得到一个错误 Error in C solarspectrum3 as double lon as doub
  • 单击并按住 R 中的按钮闪亮?

    我希望能够通过单击 R 闪亮按钮来更改参数的值 所以我需要按钮 一个用于增加值 一个用于减少值 我想在按住按钮的同时保持值以一定的速度减少 增加 通过释放按钮的点击 动作应该停止 到目前为止我还没有找到这个选项actionButtons在
  • 在 Shiny 中使用 readlines(prompt = )

    我有一个代码 使用以下方式获取输入readlines prompt 功能 您能告诉我 Shiny 中的哪个输入函数足以将此代码适应 Shiny 应用程序吗 我需要一个交互功能 我无法使用简单的输入selectInput 因为我有很多read
  • R - 根据另一个数据框查找每组的重叠日期

    我有一个数据框 其中包含多个雨量计的降雨测量值 如下例所示 gt rnfl ID date value 1 250 2000 03 01 5 37 2 250 2000 03 02 0 00 3 250 2000 03 03 2 94 4
  • R 中大型稀疏矩阵的聚类分析

    我有一个包含 250000 笔交易 行 和 2183 项 列 的交易数据集 我想将其转换为稀疏矩阵 然后对其进行分层聚类 我尝试了包 sparcl 但它似乎不适用于稀疏矩阵 关于如何解决这个问题有什么建议吗 或者我可以使用任何其他包对稀疏矩
  • glm() 模型的交叉验证

    我正在尝试对我之前在 R 中构建的一些 glm 模型进行 10 倍交叉验证 我对cv glm 函数在boot包 尽管我已经阅读了很多帮助文件 当我提供以下公式时 library boot cv glm data glmfit K 10 这里
  • 使用 ggplotly(ggplot2 withplotly)时可以去掉注释中的跟踪标签吗?

    使用ggplotly时是否可以删除注释中的跟踪标签 例如 library ggplot2 library plotly g lt ggplot iris aes Sepal Width Sepal Length geom point ann
  • 为什么这个 Rust 程序忽略不变性

    我有以下 Rust 程序 我希望它会导致编译错误 因为x稍后会重新分配 但它遵守并给出输出 为什么 fn main let x y 1 3 println X is and Y is x y let x i32 565 println No
  • 如何判断某个软件包是否已经安装?

    当我安装 yaml 包时 如果之前已经安装过 RStudio 则会弹出一条烦人的错误消息 如何判断该软件包是否已安装 以便我可以在代码中决定是否安装该软件包 该消息位于弹出窗口中 内容如下 此安装将更新的一个或多个软件包 当前已加载 在更新
  • 当任何任务正在运行时,如何阻止异步程序终止?

    假设我有这样的东西 async fn do update here we store it let task task spawn async let duration Duration from millis 10 let mut str

随机推荐

  • 无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象

    我已经阅读了一些与此特定错误消息有关的问题 答案 但我不太了解适当的解决方案 我多次读到您应该创建 EF4 上下文 使用它 然后处理它 在我的应用程序中 我使用不同的上下文对象到处加载实体 然后最终希望将这些实体关联在一起 我创建了一个简单
  • 在 WooCommerce 中付款后立即更改订单状态[重复]

    这个问题在这里已经有答案了 我需要在收到付款后自动将订单状态更改为已完成 但前提是订单状态为 正在处理 我发现了这个片段 是什么让订单状态在每种情况下都完成 但是我的付款插件在成功付款更改后返回数据并更改 处理 的订单状态 我想在成功后将其
  • 调整图像大小并将其设置为输入文件

    我使用 jquery 在上传时调整图像大小 效果很好 但我的问题是我想发送调整大小的图像 并且我想在输入文件中设置新图像的数据 以便在提交时将其发送到服务器 但我无法实现这一点 每次发送大文件时 这是我的代码 div div
  • 什么时候可以在类的方法中创建类的对象?

    public class TestClass public static void main String args TestClass t1 new TestClass t1 anything 在同一个类的定义中创建一个对象是不是很奇怪
  • 为什么并行填充数组时会出现竞争条件?

    Julia 语言中有一个函数 可以并行地用随机值填充数组并计算其总和 function thread test v Threads threads for i 1 length v inbounds v i rand end sum v e
  • mem_fn 到成员对象的函数

    我正在摆弄std mem fn并且无法设法将其绑定到结构成员的数据 函数 更深一层 我希望代码能比我描述的更好地显示问题 因为我不熟悉这些术语 include
  • JS一键切换(不是点击两次)-切换元素的默认值

    为什么我们需要在这里单击两次 http jsfiddle net xL8hyoye 4 http jsfiddle net xL8hyoye 4 html a href Click here to toggle visibility of
  • iOS:UIPasteboard setImage:在 iOS6 和/或 Xcode 4.5 上失败

    Update 在 Apple 网站上添加了错误 12408800 我正在将一个或多个 UIImage 复制到 UIPasteboard 它一直工作得非常顺利 直到我的手机升级到 iOS 6 Xcode 4 5 与 iOS 5 1 OK Xc
  • boost::asio::co_spawn 不会传播异常

    我正在涉足关于 boost asio 的协程 并且我对异常处理感到困惑 判断通过examples https www boost org doc libs 1 71 0 doc html boost asio example cpp17 c
  • JupyterLab 的下载文件夹

    我想从 Jupyterlab 在谷歌云实例上运行 下载一个 pickle 文件的文件夹 但我找不到这样做的方法 显然 下载单个文件是允许的 但我的文件夹中有大约 500 个 pickle 文件需要下载 因此手动下载需要一些时间 正如您在下面
  • 如何知道UILabel中显示的文字?

    我有一个UIView含有两个UILabels 以显示字符串 首先UILabel有固定的大小 如果绳子太长 容纳不下UILabel 我想在第一个中显示最大字符数UILabel 并在第二个中显示字符串的其余部分UILabel 但要做到这一点 我
  • Recordset.Edit或Update sql vba语句更新最快的方法?

    我最近遇到了vba update语句并且我一直在使用Recordset Edit and Recordset Update不仅编辑我现有的数据 而且更新它 我想知道两者的区别 recordset update and Update sql
  • calloc 与 malloc 以及时间效率

    我饶有兴趣地阅读了这篇文章C malloc和calloc的区别 https stackoverflow com questions 1538420 c difference between malloc and calloc 我在代码中使用
  • 安装软件包不起作用:权限被拒绝

    我正在努力安装 psych 包 我开始使用命令install packages psych 开始下载 结果如下 Installing package into C Users Username Documents R win library
  • 在 SQL Server 中查询对话中用户的精确匹配

    我有一个对话表和一个用户对话表 CONVERSATION Id Subject Type USERCONVERSATION Id UserId ConversationId 我需要根据 UserId 列表执行 SQL 查询 因此 如果同一个
  • @Scheduled 中的 Spring 会话范围对象

    在 Spring 中 我有很多使用如下定义的会话 bean 的代码 Scope value session proxyMode ScopedProxyMode TARGET CLASS 在我的网络应用程序中一切都很好 因为会话范围是 可用的
  • 自动将 Git 同步到 SVN

    Summary 我想要完成的是定期推送bare将 Git 存储库放入 Subversion 中 以便其他人可以使用无人值守的脚本来检查它 我不需要相反的方向 SVN gt Git 我希望有人能帮助我完成这件事 我见过的其他线程非常接近我所需
  • Flink 日志记录限制:如何将日志记录配置传递给 Flink 作业

    我有一个 flink 作业 它使用 logback 作为日志记录框架 因为日志需要发送到logstash 而 logback 有一个 logstash 附加程序 Logstash logback appender Appender 工作正常
  • 使用 Bicep 在 Azure Blob 存储容器上添加 RBAC 角色

    我正在使用 bicep 部署 azure data Lake gen2 存储帐户 我想在带有二头肌的容器上分配角色 组 参见下面的代码 但我不断收到错误 有人能帮我吗 targetScope resourceGroup param loca
  • 将 R 对象传递给 Rust 程序需要哪些步骤?

    R和Rust都可以与C代码交互 所以我认为这是很有可能的 然而 我有点不清楚如何继续 我已阅读这些部分来寻找答案 R 扩展系统和外语接口 http cran r project org doc manuals r release R ext