Thank you, Marttila and Ivan, As the original author of prettyNum() {etc ..}, I will commit such a bug fix to R-devel (and probably port it to R 4.5.0 patched) quite soon (but not yet today).
Best regards, Martin Maechler >>>>> Ivan Krylov via R-devel >>>>> on Fri, 23 May 2025 17:14:57 +0300 writes: > В Fri, 23 May 2025 11:47:33 +0000 > Marttila Mikko via R-devel <r-devel@r-project.org> пишет: >> When called with a numeric vector, the `replace.zero` argument is >> disregarded. >> >> > prettyNum(0, zero.print = "- ", replace.zero = TRUE) >> [1] "-" >> Warning message: >> In .format.zeros(x, zero.print, replace = replace.zero) : >> 'zero.print' is truncated to fit into formatted zeros; consider >> 'replace=TRUE' >> Please see below a patch which I believe would fix this. > Surprisingly, it's not enough. The 'replace' argument to .format.zeros > needs to be "threaded" through both the call to vapply(x, format, ...) > and the internal call from format.default(...) to prettyNum(...): R> options(warn = 2, error = recover) R> prettyNum(0, zero.print = "--", replace.zero = TRUE) > Error in .format.zeros(x, zero.print, replace = replace.zero) : > (converted from warning) 'zero.print' is truncated to fit into formatted zeros; consider 'replace=TRUE' > Enter a frame number, or 0 to exit > 1: prettyNum(0, zero.print = "--", replace.zero = TRUE) > 2: vapply(x, format, "", big.mark = big.mark, big.interval = big.interval, sma > 3: FUN(X[[i]], ...) > 4: format.default(X[[i]], ...) > 5: prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3, na.encode, sc > 6: .format.zeros(x, zero.print, replace = replace.zero) > 7: warning("'zero.print' is truncated to fit into formatted zeros; consider 'r > <...omitted...> > Selection: 6 > <...> > Browse[1]> ls.str() > i0 : logi TRUE > ind0 : int 1 > nc : int 1 > nx : num 0 > nz : int 2 > replace : logi FALSE > warn.non.fitting : logi TRUE > x : chr "0" > zero.print : chr "--" > Since prettyNum() accepts ... and thus ignores unknown arguments, it > seems to be safe to forward the ellipsis from format.default() to > prettyNum(). The patch survives LANGUAGE=en TZ=UTC make check-devel. > Index: src/library/base/R/format.R > =================================================================== > --- src/library/base/R/format.R (revision 88229) > +++ src/library/base/R/format.R (working copy) > @@ -73,7 +73,7 @@ > decimal.mark = decimal.mark, input.d.mark = decimal.mark, > zero.print = zero.print, drop0trailing = drop0trailing, > is.cmplx = is.complex(x), > - preserve.width = if (trim) "individual" else "common"), > + preserve.width = if (trim) "individual" else "common", ...), > ## all others (for now): > stop(gettextf("Found no format() method for class \"%s\"", > class(x)), domain = NA)) > @@ -338,7 +338,8 @@ > big.mark=big.mark, big.interval=big.interval, > small.mark=small.mark, small.interval=small.interval, > decimal.mark=decimal.mark, zero.print=zero.print, > - drop0trailing=drop0trailing, ...) > + drop0trailing=drop0trailing, replace.zero=replace.zero, > + ...) > } > ## be fast in trivial case, when all options have their default, or "match" > nMark <- big.mark == "" && small.mark == "" && (notChar || decimal.mark == input.d.mark) > -- > Best regards, > Ivan > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel