c++ - 将 R 函数作为 C 函数传递给 C

标签 c++ c r compilation abstract-syntax-tree

背景

我正在编写一个包,在 R 中针对各种预先指定的目标函数(要优化的函数)实现特定的优化算法。优化代码本身是用 C 编写的。为了使代码尽可能高效,我还用 C 重新实现了目标函数。在当前阶段,R 的作用是使用 .Call 为 C 代码提供接口(interface).

目标

我希望这个包能够处理任何用户提供的目标函数。但是,我不想从 C 调用 R 函数,这会产生大量开销,而且很可能非常慢。

我真正想要的是一种将有限类 R 函数(您通常将其视为统计和机器学习中的成本函数)作为参数传递的方法,将此 R 函数转换为 C 函数 然后随后用作优化算法中的目标函数。

解决思路

R 与 LISP 有很强的亲子关系。获取函数的抽象语法树 (AST) 非常简单。我认为可能可以将 AST 解析为 C 函数,然后编译它或动态传递它(我不知道这在 C 中是否可行)

问题

  • 上述解决思路是否可行?
  • 还有其他方法吗?
  • 我必须学习什么才能做到这一点?

注意:没有必要将此作为 R 包执行。尝试在 R 包的刚性结构中执行此操作可能会使事情变得更加困难。

最佳答案

之前实验的一些提示:

  • R to C compiler at Rice : 放弃了

  • R to C compiler by Simon : 也陈旧。

  • Duncan Temple Lang 的 R 和 LLVM 尝试:有两个包和一篇已发表的论文,但(似乎)没有人使用它。自从我阅读这篇论文以来已经有一段时间了,但一个限制是它甚至没有试图涵盖所有的 R。

您无法轻松做到这一点的原因之一是语言在语言计算以及非标准评估与标准评估、 promise 、强制评估等方面表现出色。

最后,对于将编译目标函数 传递给优化器的狭义案例:请参阅我的 RcppDE package这是做什么的。

H/t 提醒 Josh 关于 Simon 的尝试。

关于c++ - 将 R 函数作为 C 函数传递给 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29125901/

相关文章:

java - 将 C 中带有指针的代码转换为 Java 代码

r - 测试连接的问题

css - 将 CSS 类添加到 Shiny 的 textOutput

c++ - 无法通过引用 std::exception 捕获从 std::exception 派生的类

c - Unix 上的 putenv() 和 setenv()

c++ - ActionScript/flash 和 C++ 的脚本

c++ - 满足动态条件时退出递归函数

r - 如何在 Rstudio 中关闭源回声

c++ - 不能将lambda用作unordered_set对的哈希?

c++ - 如何解决 Qt Creator 变量 -“<not accessible>” 行为 (Opencv)