R / Sweave formatting numbers with \Sexpr{} in scientific notation

后端 未结 2 1370
暗喜
暗喜 2021-02-04 07:23

I am just starting to write some documents with Sweave/R and I like the \\sexpr{} command that lets one tow write numbers directly within text.

相关标签:
2条回答
  • 2021-02-04 07:28

    An example using siunitx link to pdf. In the preamble you can define your default options which you may override later in the document.

    For numeric output :

    num <- function(x,round_precision=NULL)
    {
      if (is.null(round_precision)) {
        return(sprintf("\\num{%s}", x))
      } else {
        return(sprintf("\\num[round-precision=%s]{%s}",round_precision, x))
      }
    }
    

    For scientific output :

    sci<- function(x,round_precision=NULL){
      if (is.null(round_precision)) {
      return(sprintf("\\num[scientific-notation = true]{%s}", x))
    } else {
      return(sprintf("\\num[round-precision=%s,scientific-notation = true]{%s}",round_precision, x))
    }
    }
    

    Here is a full reproducible .Rnw script (to be used with knitr ... for sweave use four antislashes in the functions instead of two see this SO post.)

    \documentclass[a4paper]{article}
    \usepackage{siunitx}
    %\usepackage{Sweave}
    \title{siunitx}
    
    \sisetup{
    round-mode = figures,
    round-precision = 3,
    group-separator = \text{~}
    }
    \begin{document}
    
    \maketitle
    <<sanitize_number,echo=FALSE>>=
    num <- function(x,round_precision=NULL)
    {
      if (is.null(round_precision)) {
        return(sprintf("\\num{%s}", x))
      } else {
        return(sprintf("\\num[round-precision=%s]{%s}",round_precision, x))
      }
    }
    
    sci<- function(x,round_precision=NULL){
      if (is.null(round_precision)) {
      return(sprintf("\\num[scientific-notation = true]{%s}", x))
    } else {
      return(sprintf("\\num[round-precision=%s,scientific-notation = true]{%s}",round_precision, x))
    }
    }
    
    @
    Examples :\\
    $num$ for number formatting :
    
    \begin{itemize}
    \item \textbf{num(pi, round\_precision=2)} $\Rightarrow$
    \num[round-precision=2]{3.14159265358979} 
    \item \textbf{num(pi, round\_precision=4)}  $\Rightarrow$
    \num[round-precision=4]{3.14159265358979}
    \item The default formatting (here round-precision=3) is taken from
    \textbf{\textbackslash sisetup} 
    \textbf{num(pi)}  $\Rightarrow$ \num{3.14159265358979}\\
    \end{itemize}
    
    \noindent $sci$ for scientific notation :
    
    \begin{itemize}
    \item \textbf{sci(12.5687e4)}  $\Rightarrow$ \num[scientific-notation =
    true]{125687}
    \item \textbf{sci(125687.11111)}  $\Rightarrow$
    \num[scientific-notation = true]{125687.11111}
    \item \textbf{sci(125687.11111, round\_precision=4)} $\Rightarrow$
     \Sexpr{sci(125687.11111, round_precision=4)}
    \end{itemize}
    
    \end{document}
    
    0 讨论(0)
  • 2021-02-04 07:30

    I think this function should work:

    sn <- function(x,digits)
    {
      if (x==0) return("0")
      ord <- floor(log(abs(x),10))
      x <- x / 10^ord
      if (!missing(digits)) x <- format(x,digits=digits)
      if (ord==0) return(as.character(x))
      return(paste(x,"\\\\times 10^{",ord,"}",sep=""))
    }
    

    Some tests:

    > sn(2000000)
    [1] "2\\\\times 10^{6}"
    > sn(0.001)
    [1] "1\\\\times 10^{-3}"
    > sn(0.00005)
    [1] "5\\\\times 10^{-5}"
    > sn(10.1203)
    [1] "1.01203\\\\times 10^{1}"
    > sn(-0.00013)
    [1] "-1.3\\\\times 10^{-4}"
    > sn(0)
    [1] "0"
    

    If you want the result in math mode you could enter $ signs in the paste() call.

    Edit:

    Here is a Sweave example:

    \documentclass{article}
    
    \begin{document}
    <<echo=FALSE>>= 
    sn <- function(x,digits)
    {
      if (x==0) return("0")
      ord <- floor(log(abs(x),10))
      x <- x / 10^ord
      if (!missing(digits)) x <- format(x,digits=digits)
      if (ord==0) return(as.character(x))
      return(paste(x,"\\\\times 10^{",ord,"}",sep=""))
    }
    @
    
    Blablabla this is a pretty formatted number $\Sexpr{sn(0.00134,2)}$.
    
    \end{document}
    
    0 讨论(0)
提交回复
热议问题