从 C 包装器调用 R 函数

mat*_*fee 5 r

我有一个这样的功能:

callFunc <- function (f) {
    f(1)
}
Run Code Online (Sandbox Code Playgroud)

f可能是(例如)f <- function (x) x。为了简化事情,假设我知道 f 应该返回一个数字并接受一个数字。

我想转移callFunc到 C,但仍然有fR 中定义的函数,即

.Call('callFunc', function (x) x)
Run Code Online (Sandbox Code Playgroud)

我正在苦苦思索如何在 C 端评估我的回调。我现在是这样的:

#include <R.h>
#include <Rdefines.h>

SEXP callFunc (SEXP i_func) {
    return i_func(1);
}
Run Code Online (Sandbox Code Playgroud)

(然后测试它:

R CMD SHLIB test.c
# then in R
dyn.load('test.so'); .Call('callFunc', function (x) x)
Run Code Online (Sandbox Code Playgroud)

)

当然,以上不起作用,因为

  • 我没有强制i_func进入适当的关闭形式;我不知道如何做到这一点( 中有AS_fooRdefines.h,但没有AS_CLOSURE)。
  • 我什至没有告诉 C 代码i_func应该接受一个数字并返回一个数字,那么它怎么能评估呢?

谁能告诉我如何去做这件事?我正在努力编写 R 扩展,但这很长,我还没有找到我想要的东西。在 R-help 上也有这个问题,但答案看起来他们f也在 C 中实现了回调,而不是将其保留为 R 对象。

had*_*ley 3

使用 Rcpp 这很容易:

Rcpp::cppFunction("SEXP callFun(Function f) {
  return f(1);
}")

callFun(function(x) x + 10)
# [1] 11
Run Code Online (Sandbox Code Playgroud)