From 9d5ce8b4537610f0a081b95a1c5e7bae9475a443 Mon Sep 17 00:00:00 2001 From: Dirk Eddelbuettel Date: Fri, 23 May 2025 09:23:05 +0200 Subject: [PATCH 1/3] Add default ctor for Date(time)Vector classes --- ChangeLog | 6 ++++++ inst/include/Rcpp/date_datetime/newDateVector.h | 6 +++++- inst/include/Rcpp/date_datetime/newDatetimeVector.h | 6 +++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index ee9ffe0a2..96d8b5242 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2025-05-23 Dirk Eddelbuettel + + * inst/include/Rcpp/date_datetime/newDateVector.h: Add default + constructor + * inst/include/Rcpp/date_datetime/newDatetimeVector.h: Idem + 2025-05-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll micro version and date diff --git a/inst/include/Rcpp/date_datetime/newDateVector.h b/inst/include/Rcpp/date_datetime/newDateVector.h index 1b380aaab..89e3138ea 100644 --- a/inst/include/Rcpp/date_datetime/newDateVector.h +++ b/inst/include/Rcpp/date_datetime/newDateVector.h @@ -2,7 +2,7 @@ // // newDateVector.h: Rcpp R/C++ interface class library -- Date vector support // -// Copyright (C) 2016 Dirk Eddelbuettel +// Copyright (C) 2016 - 2025 Dirk Eddelbuettel // // This file is part of Rcpp. // @@ -28,6 +28,10 @@ namespace Rcpp { class newDateVector : public NumericVector { public: + newDateVector() : NumericVector() { + setClass(); + } + template newDateVector(const VectorBase& vec) : NumericVector(vec) { setClass(); diff --git a/inst/include/Rcpp/date_datetime/newDatetimeVector.h b/inst/include/Rcpp/date_datetime/newDatetimeVector.h index 224cf8929..efbae149c 100644 --- a/inst/include/Rcpp/date_datetime/newDatetimeVector.h +++ b/inst/include/Rcpp/date_datetime/newDatetimeVector.h @@ -28,10 +28,14 @@ namespace Rcpp { class newDatetimeVector : public NumericVector { public: + newDatetimeVector(const char* tz = "") : NumericVector() { + setClass(tz); + } + template newDatetimeVector(const VectorBase& other, const char* tz = "") : NumericVector(other) { - setClass(tz); + setClass(tz); } newDatetimeVector(SEXP vec, const char* tz = "") : From 60f7e9c1a2f7b69cea6acac208ad4b91aa0651cf Mon Sep 17 00:00:00 2001 From: Dirk Eddelbuettel Date: Fri, 23 May 2025 19:53:49 -0500 Subject: [PATCH 2/3] Add unit tests --- ChangeLog | 3 +++ inst/tinytest/cpp/dates.cpp | 13 ++++++++++--- inst/tinytest/test_date.R | 14 +++++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 96d8b5242..c9ebb827f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,9 @@ constructor * inst/include/Rcpp/date_datetime/newDatetimeVector.h: Idem + * inst/tinytest/test_date.R: Add tests + * inst/tinytest/cpp/dates.cpp: Idem + 2025-05-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll micro version and date diff --git a/inst/tinytest/cpp/dates.cpp b/inst/tinytest/cpp/dates.cpp index 6c5800e87..a175cc32f 100644 --- a/inst/tinytest/cpp/dates.cpp +++ b/inst/tinytest/cpp/dates.cpp @@ -1,8 +1,7 @@ -// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- -// + // dates.cpp: Rcpp R/C++ interface class library -- Date + Datetime tests // -// Copyright (C) 2010 - 2013 Dirk Eddelbuettel and Romain Francois +// Copyright (C) 2010 - 2025 Dirk Eddelbuettel and Romain Francois // // This file is part of Rcpp. // @@ -245,4 +244,12 @@ bool has_na_dtv(const Rcpp::DatetimeVector d) { return Rcpp::is_true(Rcpp::any(Rcpp::is_na(d))); } +// [[Rcpp::export]] +Rcpp::DateVector default_ctor_datevector() { + return Rcpp::DateVector(); +} +// [[Rcpp::export]] +Rcpp::DatetimeVector default_ctor_datetimevector() { + return Rcpp::DatetimeVector(); +} diff --git a/inst/tinytest/test_date.R b/inst/tinytest/test_date.R index a24e2668f..81906ddf1 100644 --- a/inst/tinytest/test_date.R +++ b/inst/tinytest/test_date.R @@ -1,5 +1,5 @@ -## Copyright (C) 2010 - 2019 Dirk Eddelbuettel and Romain Francois +## Copyright (C) 2010 - 2025 Dirk Eddelbuettel and Romain Francois ## ## This file is part of Rcpp. ## @@ -241,3 +241,15 @@ dvt <- Sys.time() + 0:2 expect_true(has_na_dtv(dvt) == FALSE, info="DatetimeVector.NAtest.withoutNA") dvt[1] <- NA expect_true(has_na_dtv(dvt) == TRUE, info="DatetimeVector.NAtest.withNA") + +## default ctor: date +dv <- default_ctor_datevector() +expect_true(inherits(dv, "Date")) +expect_equal(length(dv), 0L) +expect_equal(dv, as.Date(double())) + +## default ctor: datetime +dtv <- default_ctor_datetimevector() +expect_true(inherits(dtv, "POSIXct")) +expect_equal(length(dtv), 0L) +expect_equal(dtv, as.POSIXct(double(), origin="1970-01-01")) # origin for R < 4.3.0 From 0925ebf37a289b64f356dfb2e6d7c81a37ce2fe3 Mon Sep 17 00:00:00 2001 From: Dirk Eddelbuettel Date: Fri, 23 May 2025 19:58:04 -0500 Subject: [PATCH 3/3] as.Date() needs an origin too in older R --- inst/tinytest/test_date.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/tinytest/test_date.R b/inst/tinytest/test_date.R index 81906ddf1..0c5ffda01 100644 --- a/inst/tinytest/test_date.R +++ b/inst/tinytest/test_date.R @@ -246,7 +246,7 @@ expect_true(has_na_dtv(dvt) == TRUE, info="DatetimeVector.NAtest.withNA") dv <- default_ctor_datevector() expect_true(inherits(dv, "Date")) expect_equal(length(dv), 0L) -expect_equal(dv, as.Date(double())) +expect_equal(dv, as.Date(double(), origin="1970-01-01")) # origin for R < 4.3.0 ## default ctor: datetime dtv <- default_ctor_datetimevector()