簡體   English   中英

Forecast.HoltWinters沒有映射到C ++

[英]forecast.HoltWinters is not getting mapped into C++

根據示例代碼,我試圖使用c++RInside運行預測方法,但我卻Read 100 items Exception caught: not a matrix

有人可以看看我的代碼嗎?

  #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;
        }

    }

這看起來像是我在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))"));

並為我工作:

edd@dexter:~/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 

edd@dexter:~/svn/rinside/pkg/inst/examples/standard$ 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM