我有一个这样的功能:
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_foo宏Rdefines.h,但没有AS_CLOSURE)。i_func应该接受一个数字并返回一个数字,那么它怎么能评估呢?谁能告诉我如何去做这件事?我正在努力编写 R 扩展,但这很长,我还没有找到我想要的东西。在 R-help 上也有这个问题,但答案看起来他们f也在 C 中实现了回调,而不是将其保留为 R 对象。
使用 Rcpp 这很容易:
Rcpp::cppFunction("SEXP callFun(Function f) {
return f(1);
}")
callFun(function(x) x + 10)
# [1] 11
Run Code Online (Sandbox Code Playgroud)