c++ - 如何在 Rcpp / C++ 中将函数作为参数传递?
问题描述
我正在尝试编写一个函数,它可以在 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++ 对象。由于函数是在内部表示为 aSEXP
可以采用的类型的第一类 R 对象,我们当然也可以使用 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
来获得一些有意义的命中。
推荐阅读
- html - SVG clipPath 没有正确裁剪
- python - 如何从 asn1 数据文件中提取数据并将其加载到数据框中?
- r - R 难以识别带有 [:...:] 的正则表达式
- laravel - Laravel 中的更新方法
- javascript - 图像资源由 Electron-Builder 重命名
- firebase - 当用户在flutter中使用otp方法登录时,如何检查用户详细信息是否已经存在于firebase中?
- ruby-on-rails - 如何不按 N 值数量而是按 created_at.day 对记录进行分页?
- c# - 如何使用表达式设置模拟?
- javascript - 弹出视频不会显示在 3D 图片库中
- python - 我遇到了 pydoc 的问题,它说“无法将字符串转换为浮点数:'import'