我正在尝试编写一个可以在Rcpp中将函数作为其参数的函数。我已经在R中编写了一个示例函数,该示例显示了我想要的功能类型:
simulate_and_evaluate <- function(simulate, evaluate) {
y <- simulate(1)
eval <- evaluate(y)
return(eval)
}
simulate_fun <- function(n) rnorm(n, 0, 1)
evaluate_fun <- function(x) dnorm(x, 0, 1)
simulate_and_evaluate(simulate = simulate_fun,
evaluate = evaluate_fun)
在此函数中simulate_and_evaluate
,它接受两个都是函数的参数,一个参数模拟一个数字,而一个参数使用此模拟数字对一个函数求值。因此,例如,我们可以从标准法线模拟一个值,然后评估该点的标准法线的密度。有人知道Rcpp是否有办法吗?
Rcpp旨在实现R和C ++对象的无缝接口。由于函数是内部表示为a类型的一级R对象SEXP
,因此我们当然也可以将它们与Rcpp一起提供。有很多例子。
因此,这里我们只是将您的函数重写为C ++函数:
Rcpp::cppFunction("double simAndEval(Function sim, Function eval) {
double y = as<double>(sim(1));
double ev = as<double>(eval(y));
return(ev);
}")
然后我们可以将RNG设置为相同的值,运行R函数和此C ++函数并获得相同的值。太棒了
R> set.seed(123)
R> simulate_and_evaluate(simulate = simulate_fun,
+ evaluate = evaluate_fun)
[1] 0.341
R> set.seed(123) # reset RNG
R> simAndEval(simulate_fun, evaluate_fun)
[1] 0.341
R>
但是正如@MrFlick警告您的那样,这不会更快地运行,因为我们没有添加实际函数的编译执行,而只是从C ++而不是R调用它们。
之前已经讨论过该主题。请搜索StackOverflow,也许使用字符串[rcpp] Function
来获得一些有意义的点击。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句