我有一个像这样的功能:

callFunc <- function (f) {
    f(1)
}


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

我想将callFunc移至C,但仍然在R中定义了功能f,即

.Call('callFunc', function (x) x)


我在如何评估C端的回调方面苦苦挣扎。
我现在有这样的东西:

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

SEXP callFunc (SEXP i_func) {
    return i_func(1);
}


(然后对其进行测试:

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




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


我没有将i_func强制转换为适当的闭包形式;我不确定如何执行此操作(AS_foo中有Rdefines.h个宏,但没有AS_CLOSURE)。
我什至没有告诉C代码i_func应该接受一个数字并返回一个数字,那么它怎么能求值呢?


谁能给我有关如何执行此操作的指示?
我正在通过writing R extensions进行工作,但是时间很长,而且我还没有找到想要的东西。也有this question on R-help,但答案似乎是他们也在C中实现了回调f,而不是将其保留为R对象。

最佳答案

使用Rcpp非常简单:

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

callFun(function(x) x + 10)
# [1] 11

07-26 09:09