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

11
我希望我的knitr代码生成的所有数字看起来不像旧式计算器。

enter image description here

有没有选项可以获得像最后一个(用·10代替e或E的数字)?options(scipen = ...)似乎没有这个选项。我一直在搜索信息,发现可以通过LaTex中的siunitx包直接完成,将每个数字写成\num{1e-10}。但是我希望knitr自动为所有数字执行此操作,包括表格中的数字。附注:我如何避免打印时出现[1]?附注2:也许使用gsub?附注3:我回到这个问题。想象一下,我没有定义自己的表格,而是从回归中获取它并使用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 致意。
我不知道为什么会产生两个表格,而且数字对齐不正确。 无论如何,我希望不依赖于我的beauty()函数,而只使用suintx,我该怎么做?
3个回答

9
---
output: pdf_document
---


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

cat(x)

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

enter image description here


你如何将其应用于整个表格或文档? - skan
想象一下,你从回归 xtable(lm(...)) 得到了一个表格。你会如何将你的方法应用于该表格? - skan
在我尝试的例子中,xtable将科学计数法转换为标准格式(例如pvalue 2e-16变成0.00)。由于xtable执行格式化并打印一些字符,因此您可能需要grep输出并插入格式。对于您自己创建的输出,您可以应用格式或覆盖print方法,就像Baptiste建议的那样。这两种方法都比仅使用options(something = ...)更加强制。 - rawr
我将在xtable网站上提交请求,要求他们添加一些选项以实现自动化。 - skan

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


一个看起来什么都不干的函数 "function(x){x}",它的作用是什么? - skan
我无法找到?identity,这是在你必须传递一个函数但又不想让它执行任何操作时所需的。在这里,我不需要理智。 - baptiste
那么你把函数传递给谁呢? 我想我明白了,这是你在每个单元格上执行 \num{} 的方式。 - skan
想象一下,你从回归 xtable(lm(...)) 得到了一个表格。你会如何将你的方法应用于该表格? - skan
说实话,我对xtable不是很了解。 - baptiste
我回到这个问题。想象一下,我没有定义自己的表格,而是从回归中获取它并使用xtable来生成它。<<r, results='asis'>>= library(xtable) data(tli) fm2 <- lm(tlimth ~ sex*ethnicty, data = tli) xxx <- xtable(fm2) print(xxx, booktabs = TRUE) @在我的rnw文件或R代码中,我需要使用哪些选项才能自动使用siunitx?我尝试过\usepackage{siunitx}和几个\sisetup{},但似乎没有任何区别。 - skan

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选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接