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.
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}
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.
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}