R,Knitr,Rnw,美丽的科学数字

时间:2016-04-02 18:46:22

标签: r latex knitr digit scientific-notation

我希望我的编织代码生成的所有数字看起来都不像是一个老式的计算器。

enter image description here

有没有选项可以获得最后一个数字(用10而不是e或E)?

options(scipen = ...)似乎没有那个选项。

我一直在搜索信息,我发现可以使用软件包siunitx直接在LaTex中完成,写下这样的每个数字\ num {1e-10}

但是我想knitr会自动为所有数字做这件事,包括表格中的数字。

PD:当我打印某些东西时,我该如何避免[1]?

PD2:也许是gsub的东西?

PD3:
我回到这个问题了。想象一下,我没有定义自己的表,但我从回归中得到它并使用xtable来生成它。

\documentclass{article}
\usepackage{siunitx}
\usepackage{booktabs}
\sisetup{     group-minimum-digits = {3},    group-separator = {,}, exponent-product = \cdot     }
\begin{document}

<<r, results='asis'>>=

library(xtable)
data(tli)
fm2 <- lm(tlimth ~ sex*ethnicty, data = tli)
xxx <- xtable(fm2)
print(xxx, booktabs = TRUE)

@
\end{document}

但它效果不佳。我应该使用哪些选项?

这是打印的结果 enter image description here

这是print +“booktabs = T”+我的函数beauty()的结果。 enter image description here     问候。

我不知道为什么它产生两个表而不是1.而且数字没有正确对齐。 无论如何,我不想依赖我的beauty()函数但只使用suintx,我该怎么办?

3 个答案:

答案 0 :(得分:9)

我更喜欢将格式保留为siunitx,但R中的预处理可能会有点繁琐,

---
output: 
  pdf_document: 
    keep_tex: yes
header-includes:
- \usepackage{siunitx}
- \usepackage{booktabs}
---

\sisetup{detect-all, tight-spacing=false, exponent-product = \cdot,
round-mode = figures,
round-precision = 3}

```{r, results='asis'}
as.sci_fy <- function(x) {class(x) <- c("sci_fy", class(x)); x}
format.sci_fy <-  function(x) sprintf("\\num{%e}", x)
print.sci_fy <- function(x) cat(format(x))


x <- 6.22e-21
as.sci_fy(x)

d <- data.frame(x=rnorm(10), y=rnorm(10), f=letters[1:10])
d <- lapply(d, function(c) if(is.numeric(c)) format(as.sci_fy(c)) else c)

library(xtable)
d <- xtable(data.frame(d, stringsAsFactors = FALSE))
 print(d, type="latex", align = c("l", "l", "l"),
        table.placement = "!htpb",
        floating.environment = "table",
        include.rownames=FALSE, 
       sanitize.text.function = function(x){x}, booktabs=TRUE)

```

enter image description here

答案 1 :(得分:8)

---
output: pdf_document
---


```{r, results='asis'}
x <- 6.22e-21

cat(x)

cat(sfsmisc::pretty10exp(x, lab.type = 'latex')[[1]])
```

enter image description here

答案 2 :(得分:0)

我认为解决方案可能是这样的

beauty <- function(xx) {cat(gsub("\\s([-+]?[0-9]*\\.?[0-9]+)([eE]([-+]?[0-9]+))\\s", " $\\1\\\\cdot{}10^{\\3}$ ", xx, perl=T)) }

d <- data.frame(x=1:10*10000, y=1:10*1e22,f=letters[1:10])

beauty(print(xtable(d, digits=5, display=c("s","G", "G", "s")), type="latex"))

反正它并不完美。 如果有人可以优化它会很棒。 无论如何,我已向xtable发送了添加此功能的请求,但最近似乎没有太大的发展。

另一个选择是使用gsub的sanitize选项。