【发布时间】:2020-04-27 10:34:02
【问题描述】:
如何使用R语言的varargs函数,和optim函数一样?
考虑下面的代码,我想最大化对数似然函数verossimilhanca:
#include <Rcpp.h>
#include <RInside.h>
using namespace Rcpp;
// [[Rcpp::export]]
double verossimilhanca(Function pdf, NumericVector par, NumericVector x){
NumericVector log_result = log(pdf(par,x));
double soma =0;
for(int i = 0; i < log_result.size(); i++){
soma += log_result[i];
}
return -1*soma;
}
// [[Rcpp::export]]
List bootC(NumericVector x, NumericVector init_val){
Rcpp::Environment stats("package:stats");
Rcpp::Function optim = stats["optim"];
R["my_objective_fn"] = Rcpp::InternalFunction(&verossimilhanca);
Rcpp::List opt_results = optim(Rcpp::_["par"] = init_val,
Rcpp::_["fn"] = Rcpp::InternalFunction(&verossimilhanca),
Rcpp::_["method"] = "BFGS", x);
return opt_results;
// x is a data vetor.
}
总之,我有一个对数似然函数,我想最大化这个函数,x 是我的数据集。我知道 RInside 允许我在 C++ 中创建 R 的实例,但我只想通过使用 Rcpp.h 库而不诉诸 RInside.h 来解决这个问题。
【问题讨论】:
-
简而言之,这是个坏主意。您将获得 优化,其速度几乎与 R 相同,而您在 C++ 中调用它的速度更快。如果您想要 C++ 访问,请查看(开发版本)nloptr(您可以从 C 访问)。
-
另外,对于 R 中的标准 Rcpp 使用,您永远不需要
RInside.h。 -
感谢您的提示。她会很有帮助的。但只是为了扼杀我对一个问题的好奇心:我知道可以使用 R 函数并使用 Rcpp 为 C++ 代码调用此函数。如果R的这个函数接受argvar(可变参数)(...),有没有办法通过Rcpp将此函数导入C ++并且这个函数prezervar这个特性,即是否可以使用a(可变参数) (...) 在 C++ 中导入的函数?