【发布时间】:2017-09-28 16:18:23
【问题描述】:
我是 Rcpp 的新手,在我的代码中,我必须从 C++ 调用 R 函数“optim”。我参考了很多例子,但还是有一个错误:“静态断言失败:无法将类型转换为 SEXP”。这是我的代码,问题出在最后一个函数:
#include <RcppArmadillo.h>
using namespace Rcpp;
using namespace RcppArmadillo;
using namespace arma;
using namespace std;
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
double fr(arma::colvec x){
double result = 100 * (x(2) - x(1) * x(1)) * (x(2) - x(1) * x(1)) + (1 - x(1)) * (1 - x(1));
return result;
}
typedef double (*funcPtr)(arma::colvec x);
// [[Rcpp::export]]
XPtr<funcPtr> putFunPtrInXPtr(){
return(XPtr<funcPtr>(new funcPtr(&fr)));
}
// [[Rcpp::export]]
arma::colvec callOptimFun(SEXP x) {
RNGScope scope;
Rcpp::Environment stats("package:stats");
Rcpp::Function optim = stats["optim"];
XPtr<funcPtr> xpfun = putFunPtrInXPtr();
funcPtr fun = *xpfun;
Rcpp::List y = optim(x, fun);
arma::colvec r = y["par"];
return r;
}
不幸的是,我为上一个函数尝试了很多方法,但所有方法都有相同的错误。这些是我的尝试: 1.
// [[Rcpp::export]]
Rcpp::List callOptimFun(arma::colvec x) {
\\....
Rcpp::List y = optim(x, fun);
return y;
}
2.
// [[Rcpp::export]]
Rcpp::List callOptimFun(arma::colvec x) {
\\....
Rcpp::List y = optim(x, fun);
return y;
}
3.
// [[Rcpp::export]]
Rcpp::List callOptimFun(SEXP x) {
\\....
Rcpp::List y = optim(x, fun);
return y;
}
我不熟悉 C++。可能是什么问题?谢谢!
【问题讨论】: