Ошибка Rcpp при сравнении элемента DateVector с датой - PullRequest
2 голосов
/ 04 мая 2019

Следующая функция Rcpp не компилируется:

// [[Rcpp::export]]
bool dateProb(DateVector dateVec, Date date) {
  return (dateVec[0] < date);
}

Я получаю сообщение об ошибке:

Использование перегруженного оператора '<' неоднозначно (с типами операндов 'typename storage_type <14> :: type' (он же 'double') и 'Rcpp :: Date)

Что я делаю не так? Почему dateVec[0] не имеет типа Rcpp::Date?

1 Ответ

4 голосов
/ 04 мая 2019

Ну, Rcpp::DateVector не является вектором Rcpp::Date с, но является классом, производным от Rcpp::NumericVector (см. здесь ).Это имеет смысл, учитывая собственную внутреннюю обработку R векторов даты:

pryr::sexp_type(as.Date("2019/05/04"))
# [1] "REALSXP"

Итак, поначалу это может показаться удивительным, но это не является серьезным препятствием.Вы можете просто сделать это:

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
bool dateProb(DateVector dateVec, Date date) {
    Date date2 = dateVec(0);
    return (date2 < date);
}

Это прекрасно компилируется и дает ожидаемый ответ от R:

x <- as.Date("2019/05/04")
y <- as.Date("2019/05/03")
dateProb(x, y)
# [1] FALSE

dateProb(y, x)
# [1] TRUE

Если то, что вы на самом деле хотите, это вектор Rcpp::Date s, что может быть легко достигнуто с помощью функции-члена getDates():

// [[Rcpp::export]]
bool dateProb(DateVector dateVec, Date date) {
    Date date2 = dateVec(0);
    std::vector<Date> newdates = dateVec.getDates();
    Rcpp::Rcout << (newdates[0] < date) << "\n";
    return (date2 < date);
}

/*** R
x <- as.Date("2019/05/04")
y <- as.Date("2019/05/03")
dateProb(x, y)
dateProb(y, x)
*/

> x <- as.Date("2019/05/04")

> y <- as.Date("2019/05/03")

> dateProb(x, y)
0
[1] FALSE

> dateProb(y, x)
1
[1] TRUE

Или просто указав это в качестве ввода:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
bool dateProb(std::vector<Date> dateVec, Date date) {
    return (dateVec[0] < date);
}

/*** R
x <- as.Date("2019/05/04")
y <- as.Date("2019/05/03")
dateProb(x, y)
dateProb(y, x)
*/

> x <- as.Date("2019/05/04")

> y <- as.Date("2019/05/03")

> dateProb(x, y)
[1] FALSE

> dateProb(y, x)
[1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...