如何在Rcpp / C ++中将函数作为参数传递?

问题描述 投票:0回答:1

我正在尝试编写一个可以在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中是否有办法吗?

c++ r rcpp
1个回答
0
投票

Rcpp旨在实现R和C ++对象的无缝接口。由于函数是内部表示为SEXP的类型的第一类R对象,因此我们[也可以将它们与Rcpp一起提供。有很多例子。

所以这里我们只是

rewrite

您作为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以获得有意义的匹配。
© www.soinside.com 2019 - 2024. All rights reserved.