gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:44:33 24 4
gpt4 key购买 nike

R 和 Rust 都可以与 C 代码接口(interface),所以我认为这是很有可能的。但是,我不太清楚如何进行。

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

  1. R-extensions System-and-foreign-language-interfaces
  2. The Rust foreign function interface guide

但是,虽然我精通 R,但我不是系统程序员,并且对这种努力的构建链是什么样子感到困惑。

使用 Rinternals.h 是理想的选择,但我也会选择更简单的 .C 接口(interface)。

最佳答案

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

首先按照以下说明创建一个 Rust 库:rust-inside-other-languages .这是一个示例 Rust 库:

//src/lib.rs

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

如果您按照 rust-inside-other-languages 中的说明进行操作,那么您应该能够生成 *.so(或 *.dll.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) 的存储目录。在 shell 中执行:

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

最后在Rstudo中,写这个文件:

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 中的 -L 选项指向包含您的 Rust 共享对象的目录。
  • 还要注意 -l 选项是没有 lib 前缀和 .so(或其他任何内容)的共享对象的名称它在你的系统上)后缀。
  • 在 R 中使用 Sys.setenv 设置 LD_LIBRARY_PATH 变量不起作用。在启动 R 之前导出变量。
  • 那里有verbose 选项,因此您可以看到Rcpp 对编译C++ 文件做了什么。请注意上面的 PKG_LIBS 中的选项是如何用于编译 C++ 文件的。
  • rebuild 选项用于在您每次运行这行 R 代码时强制重建 C++ 文件。

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

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

希望对您有所帮助:)


最后请注意,基本函数 dyn.load.C 可以用作替代方法。但这需要编写比这种方法更多的样板包装代码。

关于r - 将 R 对象传递给 Rust 程序需要哪些步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28901036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com