#' Chiffres significatifs
#'
#' Affiche un nombre (ou un vecteur numérique) avec le bon nombre de chiffres significatifs.
#'
#' Si `type="NUM"`, `decimal.mark="."` et `big.mark=""`.
#'
#' @param x Nombre à convertir.
#' @param signif Chiffres significatifs.
#' @param decimal.mark Symbole désignant les décimales.
#' @param big.mark Symbole désignant les milliers.
#' @param type `"CHR"` pour convertir en `character` ou `"NUM"` pour `numeric`.
#' @param ... Arguments de \code{\link[base]{format}}.
#'
#' @return Nombre \code{x} de format CHR, formatté selon les arguments avec \code{signif} chiffres significatifs.
#' @export
#' @examples
#' nsignif(123.12, 1)
#' nsignif(123.12, 2, decimal.mark = ".")
#' nsignif(123.12, 3, decimal.mark = ",")
#' nsignif(123.12, 4, decimal.mark = ".", big.mark = "", type = "NUM")
#' nsignif(123.12, 5)
#' nsignif(123.12, 6)
nsignif <- function(x, signif = 3, decimal.mark = ",", big.mark = " ", type = "CHR", ...){
if(type == "NUM"){
if(decimal.mark != "." | big.mark != ""){
stop("Si type='NUM', decimal.mark='.' et big.mark = '' .")
}
}
nsignifX <- function(x, signif){
if(!is.numeric(x)){
return(x)
} else {
x <- signif(x, signif)
# Nombre de décimales dans un nombre
num_decimals <- function (x){
if ((x%%1) != 0) {
nchar(strsplit(sub("0+$", "", as.character(x)), ".",
fixed = TRUE)[[1]][[2]])
}
else {
return(0)
}
}
decix <- num_decimals(x)
# Nombre de "chiffres" dans le nombre (nchar sans la décimale)
ndigits <- function(x){
nchar(sub('^0+','',sub('\\.','',x)))
}
ncharx <- ndigits(x)
# Détermine le nombre de charactères manquants
char <- signif - ncharx
# Décimales à afficher
dshow <- char + decix
# Affichage du nombre
if(char>0){
x <- format(signif(x, digits = signif),
digits = dshow,
nsmall = dshow,
decimal.mark = decimal.mark,
big.mark = big.mark,
...)
if(type == "CHR"){
return(x)
} else if(type == "NUM"){
return(as.numeric(x))
} else {
stop(paste0(type," n'est pas une valeur permise de 'type'."))
}
} else {
x <- format(signif(x, digits = signif),
decimal.mark = decimal.mark,
big.mark = big.mark,
...)
if(type == "CHR"){
return(x)
} else if(type == "NUM"){
return(as.numeric(x))
} else {
stop(paste0(type," n'est pas une valeur permise de 'type'."))
}
}
}
}
return(sapply(x, nsignifX, signif))
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.