Skip to content

Commit 6f059f4

Browse files
committed
fix for #414
1 parent 2811d2f commit 6f059f4

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

R/dist_quantiles.R

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,12 @@ is_dist_quantiles <- function(x) {
128128
median.dist_quantiles <- function(x, na.rm = FALSE, ..., middle = c("cubic", "linear")) {
129129
quantile_levels <- field(x, "quantile_levels")
130130
values <- field(x, "values")
131+
# we have exactly that quantile
131132
if (0.5 %in% quantile_levels) {
132133
return(values[match(0.5, quantile_levels)])
133134
}
134-
if (length(quantile_levels) < 2 || min(quantile_levels) > 0.5 || max(quantile_levels) < 0.5) {
135+
# if there's only 1 quantile_level (and it isn't 0.5), or the smallest quantile is larger than 0.5 or the largest smaller than 0.5, or if every value is NA, return NA
136+
if (length(quantile_levels) < 2 || min(quantile_levels) > 0.5 || max(quantile_levels) < 0.5 || all(is.na(values))) {
135137
return(NA)
136138
}
137139
if (length(quantile_levels) < 3 || min(quantile_levels) > .25 || max(quantile_levels) < .75) {
@@ -161,6 +163,9 @@ quantile_extrapolate <- function(x, tau_out, middle) {
161163
tau <- field(x, "quantile_levels")
162164
qvals <- field(x, "values")
163165
nas <- is.na(qvals)
166+
if (all(nas)) {
167+
return(rep(NA, times = length(tau_out)))
168+
}
164169
qvals_out <- rep(NA, length(tau_out))
165170
qvals <- qvals[!nas]
166171
tau <- tau[!nas]

tests/testthat/test-dist_quantiles.R

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,14 @@ test_that("arithmetic works on quantiles", {
110110
expect_snapshot(error = TRUE, sum(dstn))
111111
expect_snapshot(error = TRUE, suppressWarnings(dstn + distributional::dist_normal()))
112112
})
113+
114+
test_that("quantile.dist_quantile works for NA vectors", {
115+
distn <- dist_quantiles(
116+
list(c(NA, NA)),
117+
list(1:2/3)
118+
)
119+
expect_true(is.na(quantile(distn, p = 0.5)))
120+
expect_true(is.na(median(distn)))
121+
expect_true(is.na(mean(distn)))
122+
expect_equal(format(distn), "quantiles(NA)[2]")
123+
})

0 commit comments

Comments
 (0)