【发布时间】:2015-03-18 15:20:27
【问题描述】:
背景
我正在编写一个包,在 R 中为各种预先指定的目标函数(要优化的函数)实现特定的优化算法。优化代码本身是用 C 编写的。为了使代码尽可能高效,我还用 C 重新实现了目标函数。现阶段 R 的作用是使用 .Call 为 C 代码提供接口.
目标
我希望包能够处理任何用户提供的目标函数。但是,我不想从 C 中调用 R 函数,这会产生很大的开销,而且很可能会非常缓慢。
我真正想要的是一种将有限类别的 R 函数(在统计和机器学习中通常视为成本函数)作为参数传递的方法,将此 R 函数转换为 C 函数 然后在优化算法中用作目标函数。
解决方案
R 与 LISP 有着深厚的关系。获取函数的抽象语法树 (AST) 非常简单。我在想可能可以将 AST 解析为 C 函数,然后编译它或动态传递它(我不知道这在 C 中是否可行)
问题
- 上面的解决思路是否可行?
- 还有其他方法可以做到这一点吗?
- 我必须学习什么才能做到这一点?
注意:不需要将其作为 R 包进行。尝试在 R 包的刚性结构中执行此操作可能会使事情变得更加困难。
【问题讨论】:
-
看这个例子如何从C调用R:gist.github.com/Sharpie/323498
-
谢谢。是的,我知道。但这不是我想要的。我不想从 C 中调用 R 函数。我想将 R 函数转换为 C 函数。
-
我不认为从 C 调用 R 有很大的开销。每次在 R 中执行一行时,您都在调用某个 C 函数。但是,我认为您的要求通常不可行且有效。如果是这样,每个 R 函数都将在 C 中翻译,然后在 R 中,您只需使用简单的包装器即可调用 C 函数。
-
由于 R 目标函数会很慢并且在优化过程中调用数千次,因此存在固有的巨大开销。至于效率,这种方法在几个python包中实现得非常成功(例如在Theano中)
-
好的,为这样的东西编写一个正式的规范,然后你应该能够弄清楚是否可以将其转码为 C 或 C++,然后使用 Rcpp 动态加载它。学习 C 或 C++ 可能更容易。
标签: c++ c r compilation abstract-syntax-tree