如何在 Rcpp / C++ 中将函数作为参数传递?
How to pass in functions as arguments in 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++ 对象的接口。由于函数首先是 class 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 中调用它们。
之前讨论过这个话题。请搜索 Whosebug,也许使用字符串 [rcpp] Function
以获得一些有意义的匹配。
我正在尝试编写一个可以在 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++ 对象的接口。由于函数首先是 class 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 中调用它们。
之前讨论过这个话题。请搜索 Whosebug,也许使用字符串 [rcpp] Function
以获得一些有意义的匹配。