带rcpp的ACF功能

带rcpp的ACF功能,r,rcpp,R,Rcpp,我试图创建一个函数,将样本自相关(ACF)添加到固定滞后。我不太了解c++的语法,不知道如何解决这个错误 #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] List acfC(NumericVector x, bool plot = true, int lagmax = NULL) { Environment stats("package:stats"); Function ri=stats["acf"]

我试图创建一个函数,将样本自相关(ACF)添加到固定滞后。我不太了解c++的语法,不知道如何解决这个错误

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List acfC(NumericVector x, bool plot = true, int lagmax = NULL) {
  Environment stats("package:stats");
  Function ri=stats["acf"];
  List result =  sum(ri(x)[[1]]);
  return(result);
}

<强>注:函数不应该显示图,应该处理缺失值Na.< /P> < P>希望你的C++函数比调用R更有用,否则这就没有意义了。无论如何:

    在C++和R中,LI> <代码> null <代码>是不同的。使用
    Rcpp::Nullable
  • 如果一个R函数有您想要指定的默认参数,那么您必须按照正确的顺序执行
  • 代码> [R/COD]在R和C++中有不同的含义。
  • sum
    返回一个
    double
    时,为什么要返回一个
    列表
以下是调整后的代码:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double acfC(NumericVector x, bool plot = true, Nullable<int> lagmax = R_NilValue) {
  Environment stats("package:stats");
  Function ri = stats["acf"];
  Function na_pass = stats["na.pass"];
  List result =  ri(x, lagmax, "correlation", plot, na_pass);
  NumericVector acf = result["acf"];
  return(sum(acf));
}

/*** R
set.seed(1)
y = c(arima.sim(model = list(ar = 0.7), n = 200),NA)
acfC(y,lagmax = 10,plot = F)


res = acf(y, lag.max = 10,plot = F, na.action = na.pass)
sum(res$acf)
*/
#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
双acfC(数值向量x,布尔图=真,可空lagmax=R_值){
环境统计数据(“包:统计数据”);
函数ri=stats[“acf”];
函数na_pass=stats[“na.pass”];
列表结果=ri(x,lagmax,“相关性”,绘图,na_过程);
数值向量acf=结果[“acf”];
回报(金额(acf));
}
/***R
种子(1)
y=c(arima.sim(模型=列表(ar=0.7),n=200),NA)
acfC(y,lagmax=10,绘图=F)
res=acf(y,lag.max=10,plot=F,na.action=na.pass)
总额(res$acf)
*/

<>代码> 我希望你的C++函数不仅仅是调用r,否则这毫无意义。无论如何:

    C++中的代码>空< /代码>不同。使用<代码> RCPP::可空< <代码> < /LI>
  • 如果一个R函数有您想要指定的默认参数,那么您必须按照正确的顺序执行
  • 代码> [R/COD]在R和C++中有不同的含义。
  • sum
    返回一个
    double
    时,为什么要返回一个
    列表
以下是调整后的代码:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double acfC(NumericVector x, bool plot = true, Nullable<int> lagmax = R_NilValue) {
  Environment stats("package:stats");
  Function ri = stats["acf"];
  Function na_pass = stats["na.pass"];
  List result =  ri(x, lagmax, "correlation", plot, na_pass);
  NumericVector acf = result["acf"];
  return(sum(acf));
}

/*** R
set.seed(1)
y = c(arima.sim(model = list(ar = 0.7), n = 200),NA)
acfC(y,lagmax = 10,plot = F)


res = acf(y, lag.max = 10,plot = F, na.action = na.pass)
sum(res$acf)
*/
#包括
使用名称空间Rcpp;
//[[Rcpp::导出]]
双acfC(数值向量x,布尔图=真,可空lagmax=R_值){
环境统计数据(“包:统计数据”);
函数ri=stats[“acf”];
函数na_pass=stats[“na.pass”];
列表结果=ri(x,lagmax,“相关性”,绘图,na_过程);
数值向量acf=结果[“acf”];
回报(金额(acf));
}
/***R
种子(1)
y=c(arima.sim(模型=列表(ar=0.7),n=200),NA)
acfC(y,lagmax=10,绘图=F)
res=acf(y,lag.max=10,plot=F,na.action=na.pass)
总额(res$acf)
*/

<代码>你知道这是以R代码的速度运行R代码吗?你只不过是通过C++调用来让你的生活变得更困难。@德克,这是我想用前两句话来表达的。也许我应该更明确一些。我知道你知道。我只是想确认OP知道。拉斐尔,请看Dirk的评论。我不知道他们想告诉我什么,代码不会快。我只需要知道如何通过调用C++来使用ACF,来做一个更复杂的项目。你知道这是以R代码的速度运行R代码吗?你只是通过调用C++来让你的生活变得更困难。这就是我想用前两句话表达的。也许我应该说得更清楚。我知道你知道。我只是想确保OP知道。@Rafael请看Dirk的评论,以防你根据我的回答不清楚。我明白他们想告诉我什么,代码不会更快。我只需要知道如何使用ACF调用c++,使项目更加复杂。