forked from ddsjoberg/gtsummary
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstyle_sigfig.R
51 lines (50 loc) · 1.92 KB
/
style_sigfig.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#' Style significant figure-like rounding
#'
#' Converts a numeric argument into a string that has been rounded to a
#' significant figure-like number. Scientific notation output
#' is avoided, however, and additional significant figures may be displayed for
#' large numbers. For example, if the number of significant digits
#' requested is 2, 123 will be displayed (rather than 120 or 1.2x10^2).
#'
#' @section Details:
#'
#' - Scientific notation output is avoided.
#'
#' - If 2 significant figures are requested, the number is rounded to no more than 2 decimal places.
#' For example, a number will be rounded to 2 decimals places when `abs(x) < 1`,
#' 1 decimal place when `abs(x) >= 1 & abs(x) < 10`,
#' and to the nearest integer when `abs(x) >= 10`.
#'
#' - Additional significant figures
#' may be displayed for large numbers. For example, if the number of
#' significant digits requested is 2,
#' 123 will be displayed (rather than 120 or 1.2x10^2).
#'
#' @param x Numeric vector
#' @param digits Integer specifying the minimum number of significant
#' digits to display
#' @inheritParams style_number
#' @export
#' @return A character vector of styled numbers
#' @family style tools
#' @author Daniel D. Sjoberg
#' @examples
#' c(0.123, 0.9, 1.1234, 12.345, -0.123, -0.9, -1.1234, -132.345, NA, -0.001) %>%
#' style_sigfig()
style_sigfig <- function(x, digits = 2, scale = 1, big.mark = NULL, decimal.mark = NULL, ...) {
# calculating the number of digits to round number
d <-
paste0(
"round2(abs(x * scale), digits = ", digits:1 + 1L, ") ",
"< 10^(", 1:digits - 1, ") - 0.5 * 10^(", -(digits:1), ") ~ ", digits:1,
collapse = ", "
) %>%
{
paste0("case_when(", ., ", TRUE ~ 0)")
} %>%
# converting strings into expressions to run
parse(text = .) %>%
eval()
# formatting number
style_number(x, digits = d, scale = scale, big.mark = big.mark, decimal.mark = decimal.mark, ...)
}