带rcpp的ACF功能
我试图创建一个函数,将样本自相关(ACF)添加到固定滞后。我不太了解c++的语法,不知道如何解决这个错误带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"]
#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
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++,使项目更加复杂。