72 lines
2.5 KiB
R
Raw Normal View History

2025-01-12 00:52:51 +08:00
## [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)
}