RCPP错误,将DateVector元素与Date进行比较

时间:2019-05-04 10:04:50

标签: r rcpp

以下Rcpp函数无法编译:

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

我收到错误消息:

  

使用重载运算符'<'是模棱两可的(操作数类型为'typename storage_type <14> :: type'(aka'double')和'Rcpp :: Date)

我在做什么错?为什么dateVec[0]的类型不是Rcpp::Date

1 个答案:

答案 0 :(得分:4)

好吧,MAP_FIXED不是Rcpp::DateVector的向量,而是从Rcpp::Date派生的类(请参见here)。考虑到R自己对日期向量的内部处理,这是有道理的:

Rcpp::NumericVector

因此,乍一看似乎令人惊讶,但这并不是真正的障碍。您可以这样做:

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

这可以很好地编译,并给出R的预期答案:

#include <Rcpp.h>

using namespace Rcpp;

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

如果您真正想要的是x <- as.Date("2019/05/04") y <- as.Date("2019/05/03") dateProb(x, y) # [1] FALSE dateProb(y, x) # [1] TRUE 的向量,则可以使用成员函数Rcpp::Date轻松实现:

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