[Rcpp-devel] [R] How to convert SEXP to double
Romain Francois
romain.francois at dbmail.com
Tue Sep 28 09:55:30 CEST 2010
Le 28/09/10 08:43, Dmitrij Kudriavcev a écrit :
>
> Hello All,
>
> A simple question.
>
> I get some return from the R in my C++ program (via Rcpp package). The
> result come, as SEXP and it should be a simple numeric variable.
>
> How to convert it to double?
>
> The code, what i use:
>
> stringstream ss;
> ss<< "p<- predict(fit_ar11, n.ahead = 2, doplot=FALSE);"
> << "p$pred[1]";
>
> SEXP ans;
> int iRet = R.parseEval(ss.str().c_str());
> if (iRet == 0&& ans != NULL)
> {
>
> // ???
> }
>
> Cheers,
> Dima
Hello,
Questions about Rcpp should go to the Rcpp-devel mailing list (cc'ed).
You probably meant to use thsi version of parseEval:
int parseEval(const std::string & line, SEXP &ans); // parse line,
return in ans; error code rc
In your example "ans" is never used or initialized, so you have less
than zero chances of it to work.
With recent versions of RInside, you may just do :
double res = R.parseEval( ss.str().c_str() ) ;
conversion will work itself out.
why:
parseEval implements the proxy pattern:
RInside::Proxy RInside::parseEval(const std::string & line) {
SEXP ans;
int rc = parseEval(line, ans);
if (rc != 0) {
throw std::runtime_error(std::string("Error evaluating: ") + line);
}
return Proxy( ans );
}
and Proxy has a templated implicit conversion operator:
class Proxy {
public:
Proxy(SEXP xx): x(xx) { };
template <typename T>
operator T() {
return ::Rcpp::as<T>(x);
}
private:
Rcpp::RObject x;
};
Please register to the Rcpp-devel mailing list of you have follow up
questions.
Romain
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/cCmbgg : Rcpp 0.8.6
|- http://bit.ly/bzoWrs : Rcpp svn revision 2000
`- http://bit.ly/b8VNE2 : Rcpp at LondonR, oct 5th
More information about the Rcpp-devel
mailing list