## [Bug 18476] alpha handling in palette functions (23 Feb 2023) ## https://bugs.r-project.org/show_bug.cgi?id=18476 ## Attachment 3131 https://bugs.r-project.org/attachment.cgi?id=3131 ## and comment #3 by Achim Zeileis ## from attachment #3131 : check_alpha <- function(colors = "topo.colors", ncolor = 3, nalpha = 3, ...) { ## alpha sequence of length nalpha alpha <- seq(0, 1, length.out = nalpha) ## generate colors with alpha=... col1 <- tryCatch(do.call(colors, c(list(n = ncolor, alpha = alpha), list(...))), error = identity) if(inherits(col1, "error")) return(FALSE) ## generate colors without alpha= and add manually afterwards alpha <- format(as.hexmode(round(alpha * 255 + 0.0001)), width = 2L, upper.case = TRUE) col2 <- paste0(do.call(colors, c(list(n = ncolor), list(...))), rep_len(alpha, ncolor)) ## check whether both strategies yield identical output identical(col1, col2) } expndGrid <- function(...) expand.grid(..., KEEP.OUT.ATTRS = FALSE, stringsAsFactors = FALSE) iSamp <- function(n, f=1/4, nS = max(min(n, 24L), f*n), full = interactive()) if(full) seq_len(n) else sample.int(n, nS) chkALLalpha <- function(d) vapply(iSamp(nrow(d)), function(i) do.call(check_alpha, d[i,]), NA) ## Check old palettes ------------------ d1 <- expndGrid(colors = c("rainbow", "topo.colors", "terrain.colors", "heat.colors", "cm.colors", "gray.colors"), ncolor = c(1, 3, 9, 100), nalpha = c(2, 3, 9, 100)) table(L <- chkALLalpha(d1)) ## R-4.2.x: 71 FALSE, 25 TRUE -- now 96 TRUE if(!all(L)) stop("---> not all ok") ## Check the new palettes ----------------- d2 <- expndGrid(colors = "palette.colors", ncolor = c(1, 3, 7), nalpha = c(2, 3, 7), palette = print(palette.pals())) table(L <- chkALLalpha(d2)) ## R-4.2.x: 64 FALSE, 80 TRUE -- now 144 TRUE if(!all(L)) stop("---> not all ok") d3 <- expndGrid(colors = "hcl.colors", ncolor = c(1, 3, 9, 100), nalpha = c(2, 3, 9, 100), palette = print(hcl.pals())) table(L <- chkALLalpha(d3)) ## R-4.2.x: 1057 FALSE, 783 TRUE -- now 1840 TRUE if(!all(L)) stop("---> not all ok") ## Regr.test for PR#18523: stopifnot(identical(c("#002E60", "#3E2000"), hcl.colors(2, "Vik"))) div.pals <- hcl.pals(type="diverging") divXpals <- hcl.pals(type="divergingx") for(p in c(div.pals, divXpals)) { c2 <- hcl.colors(2, p) c3 <- hcl.colors(3, p) stopifnot(length(setdiff(c3,c2)) == 1L) ## cat(p,": "); print(c2) }