r-预测.HoltWinters没有被映射到C++中

r - forecast.HoltWinters is not getting mapped into C++

本文关键字:映射 C++ 预测 HoltWinters      更新时间:2023-10-16

根据示例代码,我试图使用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 << "nnAnd now from C++nnttt";
            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$