R / Sweave форматирование чисел с \ Sexpr {} в научной нотации - PullRequest
15 голосов
/ 03 декабря 2011

Я только начинаю писать некоторые документы с помощью 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, что, возможно, дает нам возможность также контролировать количество значащих цифр.

Как этого добиться?

Ответы [ 2 ]

15 голосов
/ 03 декабря 2011

Я думаю, что эта функция должна работать:

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() call.

Редактировать:

Вот пример 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}
0 голосов
/ 31 декабря 2017

Пример использования 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 (для использования с knitr ... для свипирования используйте четыре антиспеша в функциях вместо двух, см. 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}
...