Skip to content

Commit 209ce33

Browse files
author
Stefan Fleck
committed
qy can now handle inputs without seperator between quarter and year
(e.g. `myfile42019`)
1 parent d9dc64c commit 209ce33

4 files changed

Lines changed: 35 additions & 11 deletions

File tree

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ Type: Package
22
Package: dint
33
Title: A Toolkit for Year-Quarter, Year-Month and Year-Isoweek
44
Dates
5-
Version: 2.1.3.9000
5+
Version: 2.1.3.9001
66
Authors@R:
77
person(given = "Stefan",
88
family = "Fleck",

NEWS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
* vectors of length 1 are now recycled when adding or subtracting `date_xx`
44
objects, e.g. `date_yq(2019, 1) + 1:4` is now possible (#5).
5+
* `qy` can now handle inputs without seperator between quarter and year
6+
(e.g. `myfile42019`)
57

68

79
# dint 2.1.3

R/parser.R

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ yq <- function(x, quiet = FALSE){
4242
#' @export
4343
qy <- function(x, quiet = FALSE){
4444
assert(is.character(x), "'x' must be a character vector")
45-
r <- vapply(x, parse_yq, integer(1), pattern = "^[^0-9]*[1-4][^0-9]*\\d{4}[^0-9]*$", USE.NAMES = FALSE)
45+
r <- vapply(x, parse_qy, integer(1), pattern = "^[^0-9]*[1-4][^0-9]*\\d{4}[^0-9]*$", USE.NAMES = FALSE)
4646

4747
if (!quiet){
4848
failed <- sum(is.na(r)) - sum(is.na(x))
@@ -129,6 +129,31 @@ parse_yq <- function(x, pattern){
129129

130130

131131

132+
parse_qy <- function(x, pattern){
133+
if (!grepl(pattern, x)){
134+
return(NA_integer_)
135+
}
136+
137+
extr <- function(string, pos, length){
138+
if (identical(pos, -1))
139+
NA_integer_
140+
else
141+
as.integer(substr(string, pos, pos + length))
142+
}
143+
144+
pos_y <- regexpr("\\d{4}[^0-9]*$", x)
145+
year <- extr(x, pos_y, 3)
146+
x <- strtrim(x, pos_y - 1L)
147+
148+
pos_q <- regexpr("[1-4]{1}[^0-9]*", x)
149+
quarter <- extr(x, pos_q, 0)
150+
151+
as.integer(year) * 10L + as.integer(quarter)
152+
}
153+
154+
155+
156+
132157
#' @inheritParams parse_yq
133158
#' @return an `integer` scalar for as_date_ym
134159
#' @noRd

tests/testthat/test_parser.R

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@ context("parser")
44
test_that("yq/qy work as expected", {
55

66
x <- c("dfw2018q2", "bl2017qasdg4sadgfas", "201712", "blubb", "2017-2016", NA)
7-
8-
expect_warning(
9-
r <- as.integer(yq(x)),
10-
"3 failed"
11-
)
7+
expect_warning(r <- as.integer(yq(x)), "3 failed")
128

139
expect_identical(
1410
r,
@@ -18,16 +14,17 @@ test_that("yq/qy work as expected", {
1814

1915
x <- c("d2fw2018", "b4l2017", "122017", "blubb", "2017-2016", NA)
2016

21-
expect_warning(
22-
r <- as.integer(qy(x)),
23-
"3 failed"
24-
)
17+
expect_warning(r <- as.integer(qy(x)), "3 failed")
2518

2619
expect_identical(
2720
r,
2821
c(20182L, 20174L, NA_integer_, NA_integer_, NA_integer_, NA_integer_)
2922
)
3023

24+
expect_identical(qy("stpQ42015"))
25+
26+
27+
3128
})
3229

3330

0 commit comments

Comments
 (0)