2011-12-03 13 views
15

jestem po prostu zaczynając pisać kilka dokumentów Sweave/R i lubię polecenia \sexpr{} który pozwala numery napisać holownicze bezpośrednio w tekście.R/Sweave numery formatowania z Sexpr {} w notacji naukowej

Jeśli mam numer taki jak mus=0.0002433121, to mogę go zaokrąglić do liczby miejsc dziesiętnych, np.

\Sexpr{round(mus,7)} 

Jak napisać go w notacji naukowej czyli jak LaTeX byłoby wyprowadzanie

2.43 \times 10^{-4} 

i możemy kontrolować ilość cyfr znaczących być wyprowadzane jak 3 w tym przykładzie?

Pragnę zauważyć, że liczba jak sigma = 2000000 napisano automatycznie 2e + 06 gdybym określić

\Sexpr{round(sigma,2)}. 

wolałbym że będzie zapisana jako

2 \times 10^6 

samo jak byśmy się w LaTeX notacji i być może daje nam również możliwość kontrolowania liczby cyfr znaczących.

Jak to osiągnąć?

Odpowiedz

14

Myślę, że ta funkcja powinna działać:

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="")) 
} 

Niektóre testy:

> 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" 

Jeśli chcesz wynik w trybie matematyki można wprowadzić $ znaki w zaproszeniu paste().

Edit:

Oto Sweave przykład:

\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} 
+1

Cholera, pokonaj mnie z identyczną odpowiedzią, którą przygotowałem. :) –

+0

Zmieniono funkcję na 0 i negatywną. –

+0

@ Sacha.Interesujące i użyteczne. Wielkie dzięki i 1 głos do góry. – yCalleecharan

0

Przykładem korzystania siunitxlink to pdf. W preambule można zdefiniować domyślne opcje, które można zastąpić później w dokumencie.

Dla wyjścia numerycznej:

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

dla wyjścia naukowej:

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

siunitx example

Oto pełna powtarzalne .Rnw skrypt (do stosowania z knitr dla ... używaj czterech funkcji antyzasad w funkcjach zamiast dwóch zobacz to 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} 
Powiązane problemy