2012-03-15 42 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