Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将函数作为参数传入Rcpp/C++;?_C++_R_Rcpp - Fatal编程技术网

C++ 如何将函数作为参数传入Rcpp/C++;?

C++ 如何将函数作为参数传入Rcpp/C++;?,c++,r,rcpp,C++,R,Rcpp,我正在尝试编写一个函数,它可以将函数作为它在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 <- funct

我正在尝试编写一个函数,它可以将函数作为它在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)
SimultIsA和SypRe>

RCPP旨在实现R和C++对象的无缝接口。由于函数是第一类R对象,内部表示为a

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);
}")

但是,正如MrFlick警告过的,这将不会运行得更快,因为我们没有添加我们只从C++调用的实际函数的编译执行,而不是R.< /P>


这个话题以前已经讨论过了。请使用字符串
[rcpp]函数搜索StackOverflow,以获得一些有意义的点击。

您在这里使用rcpp有什么原因吗?是为了加速代码吗?因为如果你试图在C++的土地上调用一个标准的R函数,你可能不会得到很大的提升。如果运行高效的C++代码,Rcpp将创建工作。但这似乎不是您在这里要做的。这里有一个关于这方面的指南。另请参阅RcppDE包,其中有一个将已编译的用户提供的函数传递给优化器的工作示例。@MrFlick在我希望实现的实际函数中,我使用这些函数来模拟和评估密度,但也可以使用这些结果执行其他操作。我希望通过能够将实现这一点的一些R代码转换为Rcpp代码,这将提高我的性能。我明白,只需调用C++中的基本R函数就不会提高性能,但是希望函数会与这些函数的结果相关联,这样会提高效率。
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>