首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未将forecast.HoltWinters映射到C++

未将forecast.HoltWinters映射到C++
EN

Stack Overflow用户
提问于 2012-03-15 21:05:10
回答 1查看 271关注 0票数 1

根据示例代码,我试图使用c++RInside运行预测方法,但我得到的是Read 100 items Exception caught: not a matrix

有人能看看我的代码吗。

代码语言:javascript
复制
  #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;
        }

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-16 01:03:24

这看起来像是我在RInside源代码中包含的十几个示例中的一个的直接改编--所以这是一个很好的起点。

你引用的错误是R错误,而不是C++错误,所以我会从R中的几行R代码开始,特别注意你想要赋值的返回的class(),以确保你确实将它转换为正确的C++类型。

编辑:好的,我花了一些时间看了一下。您已经很接近了,但正如我怀疑的那样,forecast包中的类型妨碍了我们。试试这个:

代码语言:javascript
复制
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))"));

有了它,它对我来说是有效的:

代码语言:javascript
复制
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$ 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9720317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档