2012-03-15 98 views
1

基于示例代码,我试图运行使用c++RInside预测方法,但我正在逐渐Read 100 items Exception caught: not a matrixforecast.HoltWinters是没有得到映射到C++

可有人请看看我的代码。

#include <RInside.h> 
    int main (int argc, char **argv) { 
     try { 
      // create an embedded R instance 
      RInside R (argc, argv); 
      std::string txt = 
       "rain <- scan(\"http://robjhyndman.com/tsdldata/hurst/precip1.dat\",skip=1);" 
       "rainseries <- ts(rain,start=c(1813));" 
       "rainseriesforecasts <- HoltWinters(rainseries, beta=FALSE, gamma=FALSE);" 
       "suppressMessages(require(forecast));"; 

      R.parseEvalQ(txt); // eval command, no return 
      Rcpp::NumericMatrix M((SEXP)R.parseEval("rainseriesforecasts2 <- forecast.HoltWinters(rainseriesforecasts, h=8)")); 
      Rcpp::StringVector cnames((SEXP) R.parseEval("colnames(rainseriesforecasts2)")); 
      Rcpp::StringVector rnames((SEXP) R.parseEval("rownames(rainseriesforecasts2)")); 

      std::cout << "\n\nAnd now from C++\n\n\t\t\t"; 
      for (int i=0; i<cnames.size(); i++) { 
       std::cout << std::setw(11) << cnames[i] << "\t"; 
      } 
      std::cout << std::endl; 
      for (int i=0; i<rnames.size(); i++) { 
       std::cout << std::setw(16) << rnames[i] << "\t"; 
       for (int j=0; j<cnames.size(); j++) { 
        std::cout << std::setw(11) << M(i,j) << "\t"; 
       } 
       std::cout << std::endl; 
      } 
      std::cout << std::endl; 

     } catch(std::exception& ex) { 
      std::cerr << "Exception caught: " << ex.what() << std::endl; 
     } catch(...) { 
      std::cerr << "Unknown exception caught" << std::endl; 
     } 

    } 
+0

为什么关闭,请解释 – Avinash 2012-03-15 13:30:56

回答

1

这看起来像的一个超过我已经包含在RInside来源十几例子直线上升的适应 - 所以这是一个很好的起点。

你引用的错误是[R错误,而不是一个C++错误,所以我会在R.自己尝试的R代码里面的几行要特别注意你想要的回报的class()启动分配以确保将其转换为正确的C++类型。

编辑:好的,有一些时间来看看它。你很接近,但正如我怀疑类型forecast包阻碍。试试这个:

R.parseEvalQ(txt); // eval command, no return 
Rcpp::NumericMatrix M((SEXP)R.parseEval("rainseriesforecasts2 <- as.matrix(as.data.frame(forecast.HoltWinters(rainseriesforecasts, h=8)))")); 
Rcpp::StringVector cnames((SEXP) R.parseEval("colnames(as.data.frame(rainseriesforecasts2))")); 
Rcpp::StringVector rnames((SEXP) R.parseEval("rownames(as.data.frame(rainseriesforecasts2))")); 

,并用它为我的作品:

[email protected]:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample12 
Read 100 items 


And now from C++ 

      Point Forecast  Lo 80  Hi 80  Lo 95  Hi 95 
      1913  24.6782  19.1749  30.1815  16.2617  33.0947 
      1914  24.6782  19.1733  30.1831  16.2592  33.0972 
      1915  24.6782  19.1717  30.1847  16.2568  33.0996 
      1916  24.6782  19.1701  30.1863  16.2543  33.102 
      1917  24.6782  19.1685  30.1879  16.2519  33.1045 
      1918  24.6782  19.1669  30.1895  16.2495  33.1069 
      1919  24.6782  19.1653  30.1911  16.247  33.1094 
      1920  24.6782  19.1637  30.1926  16.2446  33.1118 

[email protected]:~/svn/rinside/pkg/inst/examples/standard$ 
+0

谢谢,我仍然在学习的整合,的确是直截了当的改编。我将在哪里获得关于R对象和C++类型映射的更多信息。 – Avinash 2012-03-15 17:12:45

+0

在Rcpp文档和示例中,以及RInside文档。还订阅rcpp-devel列表并阅读列表存档。 – 2012-03-15 17:15:10

+0

有没有这个 – Avinash 2012-03-15 17:35:16