R /用科学计数法用 Sexpr {}格式化数字
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R /用科学计数法用 Sexpr {}格式化数字相关的知识,希望对你有一定的参考价值。
我刚刚开始用Sweave/R
写一些文档,我喜欢sexpr{}
命令,让一个拖拽直接在文本中写入数字。
如果我有一个像mus=0.0002433121
这样的数字,那么我可以把它四舍五入到多个小数位,例如
Sexpr{round(mus,7)}
如何用科学记数法写出来,即LaTeX
将输出
2.43 imes 10^{-4}
在这个例子中,我们可以控制输出的有效位数,如3吗?
我注意到,如果我指定的话,像sigma = 2000000
这样的数字会自动写入2e + 06
Sexpr{round(sigma,2)}.
我希望它会写成
2 imes 10^6
与我们在LaTeX
表示法中得到的相同,也许我们也可以控制有效数字的数量。
怎么做到这一点?
答案
我认为这个功能应该有效:
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()
标志。
Edit:
这是一个Sweave示例:
documentclass{article}
egin{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}
另一答案
使用siunitx link to pdf的一个例子。在序言中,您可以定义默认选项,稍后可以在文档中覆盖这些选项。
对于数字输出:
num <- function(x,round_precision=NULL)
{
if (is.null(round_precision)) {
return(sprintf("
um{%s}", x))
} else {
return(sprintf("
um[round-precision=%s]{%s}",round_precision, x))
}
}
对于科学输出:
sci<- function(x,round_precision=NULL){
if (is.null(round_precision)) {
return(sprintf("
um[scientific-notation = true]{%s}", x))
} else {
return(sprintf("
um[round-precision=%s,scientific-notation = true]{%s}",round_precision, x))
}
}
这是一个完全可重现的.Rnw脚本(与knitr一起使用...用于sweave在函数中使用四个反义,而不是两个看到这个SO post。)
documentclass[a4paper]{article}
usepackage{siunitx}
%usepackage{Sweave}
itle{siunitx}
sisetup{
round-mode = figures,
round-precision = 3,
group-separator = ext{~}
}
egin{document}
maketitle
<<sanitize_number,echo=FALSE>>=
num <- function(x,round_precision=NULL)
{
if (is.null(round_precision)) {
return(sprintf("
um{%s}", x))
} else {
return(sprintf("
um[round-precision=%s]{%s}",round_precision, x))
}
}
sci<- function(x,round_precision=NULL){
if (is.null(round_precision)) {
return(sprintf("
um[scientific-notation = true]{%s}", x))
} else {
return(sprintf("
um[round-precision=%s,scientific-notation = true]{%s}",round_precision, x))
}
}
@
Examples :
$num$ for number formatting :
egin{itemize}
item extbf{num(pi, round\_precision=2)} $Rightarrow$
um[round-precision=2]{3.14159265358979}
item extbf{num(pi, round\_precision=4)} $Rightarrow$
um[round-precision=4]{3.14159265358979}
item The default formatting (here round-precision=3) is taken from
extbf{ extbackslash sisetup}
extbf{num(pi)} $Rightarrow$
um{3.14159265358979}
end{itemize}
oindent $sci$ for scientific notation :
egin{itemize}
item extbf{sci(12.5687e4)} $Rightarrow$
um[scientific-notation =
true]{125687}
item extbf{sci(125687.11111)} $Rightarrow$
um[scientific-notation = true]{125687.11111}
item extbf{sci(125687.11111, round\_precision=4)} $Rightarrow$
Sexpr{sci(125687.11111, round_precision=4)}
end{itemize}
end{document}
以上是关于R /用科学计数法用 Sexpr {}格式化数字的主要内容,如果未能解决你的问题,请参考以下文章