R/nsignif.R

Defines functions nsignif

Documented in nsignif

#' 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))
}
guiboucher/INESSS-inesss documentation built on April 20, 2020, 10:47 p.m.