将R函数作为C函数传递给C

Passing R functions to C as C functions

本文关键字:函数      更新时间:2023-10-16

背景

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

目标

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

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

解决方案理念

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

问题

  • 上述解决方案是否可行
  • 还有别的办法吗
  • 我必须学会什么才能做到这一点

注意:没有必要将其作为R程序包来执行。试图在R包的刚性结构中做到这一点可能会使事情变得更加困难。

之前实验中的一些指针:

  • Rice的R到C编译器:放弃

  • Simon的R到C编译器:也过时了。

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

你不能轻易做到这一点的原因之一是,这些语言擅长对语言进行计算,以及非标准评估与标准评估、承诺、强制评估等

最后,对于将编译的目标函数传递给optmizer的狭义情况:请参阅我的RcppDE包。

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