R/Sweave форматирование чисел с \Sexpr {} в научной нотации
Я только начинаю писать некоторые документы с помощью Sweave/R
, и мне нравится команда \sexpr{}
, которая позволяет одному буксировать записи непосредственно в тексте.
Если у меня есть число, подобное mus=0.0002433121
, я могу сказать его округление до нескольких десятичных знаков, например.
\Sexpr{round(mus,7)}
Как записать его в научной нотации, т.е. как LaTeX
будет выводить
2.43 \times 10^{-4}
и можем ли мы контролировать количество значимых цифр, которые будут выводиться как 3 в этом примере?
Я отмечаю, что число, подобное sigma = 2000000
, автоматически записывается в 2e + 06
, если я укажу
\Sexpr{round(sigma,2)}.
Я бы предпочел, чтобы он был написан как
2 \times 10^6
так же, как мы бы получили в обозначении LaTeX
и, возможно, предоставили нам возможность контролировать количество значащих цифр.
Как это сделать?
Ответы
Ответ 1
Я думаю, что эта функция должна работать:
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=""))
}
Некоторые тесты:
> 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"
Если вы хотите получить результат в математическом режиме, вы можете ввести $
знаки в вызове paste()
.
Изменить:
Вот пример Sweave:
\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}
Ответ 2
Пример использования siunitx ссылка на pdf. В преамбуле вы можете определить свои параметры по умолчанию, которые вы можете переопределить позже в документе.
Для числового вывода:
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))
}
}
![siunitx example]()
Вот полный воспроизводимый .Rnw script (для использования с knitr... для sweave используйте четыре антиспали в функциях вместо двух, см. этот 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}