Функция ACF с rcpp - PullRequest
       9

Функция ACF с rcpp

0 голосов
/ 11 июня 2018

Я пытаюсь создать функцию, которая добавляет образец автокорреляции (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);
}

Ожидаемый результат 3.579

/*** R
acfC(y,lagmax = 10,plot = F)

set.seed(1)
y = c(arima.sim(model = list(ar = 0.7), n = 200),NA)
res = acf(y, lag.max = 10,plot = F, na.action = na.pass)
sum(res$acf)
*/
[1] 3.579344

Примечание: Функция не должна показывать график и должна обрабатывать пропущенные значения NA.

1 Ответ

0 голосов
/ 11 июня 2018

Я надеюсь, что ваша настоящая функция C ++ делает больше, чем обратный вызов R. В противном случае это не имеет смысла.В любом случае:

  • NULL в C ++ и в R отличаются.Используйте Rcpp::Nullable<T>
  • Если функция R имеет аргументы по умолчанию, которые вы хотите указать, вы должны сделать это в правильном порядке.
  • [[ имеет другое значение в R и C ++.
  • Почему вы возвращаете List, когда 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)
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...