我有一个像这样的函数:
callFunc <- function (f) {
f(1)
}
f
可以是(例如)f <- function (x) x
。为了简化事情,假设我知道 f 应该返回一个数字并接受一个数字。
我想搬家callFunc
到C,但仍然有功能f
在 R 中定义,即
.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
应该接受一个数字并返回一个数字,那么它如何计算呢?
有人可以指导我如何去做这件事吗?
我正在努力克服编写 R 扩展 http://cran.r-project.org/doc/manuals/R-exts.html但这相当长,我还没有找到我想要的东西。还有R-help 上的这个问题 https://stat.ethz.ch/pipermail/r-devel/2011-September/062052.html但答案看起来他们实现了回调f
在 C 中也是如此,而不是将其保留为 R 对象。
使用 Rcpp 这很容易:
Rcpp::cppFunction("SEXP callFun(Function f) {
return f(1);
}")
callFun(function(x) x + 10)
# [1] 11
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)