C++ Rcpp/C++/R:比较DatetimeVector与Datetime时出错(错误:运算符>;&x27;的重载不明确)

C++ Rcpp/C++/R:比较DatetimeVector与Datetime时出错(错误:运算符>;&x27;的重载不明确),c++,r,rcpp,C++,R,Rcpp,不幸的是,我无法进行比较。当我尝试编译时,会收到错误消息: “运算符>”的重载不明确(操作数类型为“Rcpp::Datetime”和“Rcpp::traits::storage_type::type{aka double}”) 我附上了一个例子。它是高度简化的,旨在使错误消息可再现 你能帮我弄明白怎么了吗 // [[Rcpp::export]] void identifyValidSignalsTest(DatetimeVector & dtvopen, IntegerVector &a

不幸的是,我无法进行比较。当我尝试编译时,会收到错误消息: “运算符>”的重载不明确(操作数类型为“Rcpp::Datetime”和“Rcpp::traits::storage_type::type{aka double}”)

我附上了一个例子。它是高度简化的,旨在使错误消息可再现

你能帮我弄明白怎么了吗

// [[Rcpp::export]]
void identifyValidSignalsTest(DatetimeVector & dtvopen, IntegerVector & ivsignal) {

  Datetime dtv("2000-01-01 00:00:00");
  int n = dtvopen.length();

  // Schleife
  for(int i = 0; i < n; ++i) {
    if (dtv > dtvopen[i]) {
      ivsignal[i] = 1;
    }
  }
}
/[[Rcpp::export]]
无效识别有效信号测试(DatetimeVector和dtvopen、IntegerVector和ivsignal){
日期时间数字电视(“2000-01-01 00:00:00”);
int n=dtvopen.length();
//施莱夫
对于(int i=0;idtvopen[i]){
ivsignal[i]=1;
}
}
}

我认为有两种可能性:

最小的更改是:将
dtv
替换为
dtv.getFractionalTimestamp()
。如果向量很长,则只调用一次
dtv.getFractiltimestamp()
并将结果保存为
双精度

更完整的解决方案:直接将
dtv
dtvopen
进行比较:

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::LogicalVector identifyValidSignalsTest(Rcpp::DatetimeVector & dtvopen) {
    Rcpp::Datetime dtv("2000-01-01 00:00:00");
    return dtv > dtvopen;
}


/***R
dates <- c(Sys.time(), as.POSIXct("1999-01-01"))
identifyValidSignalsTest(dates)
*/
#包括
//[[Rcpp::导出]]
Rcpp::LogicalVector IdentificationValidSignalsTest(Rcpp::DatetimeVector和dtvopen){
日期时间数字电视(“2000-01-01 00:00:00”);
返回dtv>dtvopen;
}
/***R
日期识别有效信号测试(日期)
[1] 假真

请注意,我使用的是返回值而不是输出参数,因为这更适合R的函数样式。我还使用显式逻辑值而不是隐式逻辑值。当然,可以使用从
dtv>dtvopen
创建的逻辑向量来创建原始函数的输出值。

在读取错误消息之后,听起来像是在尝试比较两种不同类型(日期-时间vs双精度)的问题。dtv和dtvopen的类型是什么[i]?dtv=日期时间;dtvopen=日期时间向量;e、 像“2000-01-01 00:00:00”这样的Posixct C++可能很挑剔。对于标量日期时间和向量变量之间的
,我们可能没有匹配的
运算符。最糟糕的情况是,作为一种快捷方式,您可以提取底层数字。和/或使用日期的数字表示,@ Dirk C++对我来说是新的。这是我第一次尝试,因为我试图加速R功能。你能给我一个如何做你描述的事情的提示/例子吗?回答得好。另外,在实践中,我有时“作弊”as(从R)只发送
as.numeric(myDatetimeVec)
向下(并用它实例化
Rcpp::NumericVector
),然后直接比较
double
值。类似地,我经常将时间戳累积为
double
的向量,并且只在返回时或在R中键入一次。非常感谢。这就解决了问题!溴Joachim@Joachim如果答案帮助你,也可以通过点击上三角来考虑“UvoToNigg”(并且接受它是好的)。
> dates <- c(Sys.time(), as.POSIXct("1999-01-01"))

> identifyValidSignalsTest(dates)
[1] FALSE  TRUE