Ну, 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