我有一个像这样的功能:
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