Вот быстрый хак, который позволяет в дальнейшем использовать format
для большинства других функций. Единственное вмешательство, которое он делает, это проверка наличия значащих цифр, чтобы гарантировать
format2 <- function(x, ..., big.mark = "", big.interval = c(3L, 2L), decimal.mark = ".") {
intervene <- (log(abs(x), 10) >= sum(big.interval)) && nzchar(big.mark)
cl <- match.call()
cl[[1]] <- substitute(format)
if (intervene) {
cl$x <- x %/% 10^big.interval[1]
cl$big.interval <- big.interval[2]
bigx <- eval.parent(cl)
cl$x <- x
cl$big.interval <- big.interval[1]
mostx <- eval.parent(cl)
mostx <-
substr(mostx,
1L + nchar(x %/% 10^big.interval[1]) +
trunc(trunc(log(abs(x %/% 10^big.interval[1]), 10L)) / big.interval[1]),
nchar(mostx))
return( paste0(bigx, mostx) )
} else eval.parent(cl)
}
format2(123456789)
# [1] "123456789"
format2(12345, big.mark = ",") # no intervene necessary
# [1] "12,345"
format2(123456789, big.mark = ",")
# [1] "12,34,56,789"
format2(1e6 + pi, big.mark = ",")
# [1] "10,00,003"
format2(1e6 + pi, big.mark = ",", digits = 22)
# [1] "10,00,003.1415926536"
format2(1e6 + pi, big.mark = ",", digits = 22, small.mark = ",")
# [1] "10,00,003.14159,26536"
Отказ от ответственности: я, конечно, не проверял это строго, поэтому вполне возможно, что у него могут быть не охваченные крайние случаи. Пусть покупатель будет бдителен.
person
r2evans
schedule
27.05.2020