R, Knitr, Rnw, красивые научные числа

Я бы хотел, чтобы все числа, сгенерированные моими кодами для вязания, не выглядели как старомодный калькулятор.

введите здесь описание изображения

Есть ли возможность получить числа, подобные последнему (с · 10 вместо e или E)?

options(scipen=...) похоже, не имеет такой опции.

Я искал информацию и обнаружил, что это можно сделать прямо в LaTex с помощью пакета siunitx, записывая каждое число следующим образом: \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}

Но это плохо работает. Какие варианты следует использовать?

Это результат только с печатью введите здесь описание изображения

И это результат с print+"booktabs=T"+моя функция beauty(). введите здесь описание изображения с уважением.

Я не знаю, почему он выдает две таблицы вместо 1. И числа не выровнены должным образом. В любом случае, я хотел бы не зависеть от моей функции beauty(), а просто использовать suintx, как я могу это сделать?


person skan    schedule 02.04.2016    source источник


Ответы (3)


Я предпочитаю оставить форматирование 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)

```

введите здесь описание изображения

person baptiste    schedule 02.04.2016
comment
Что за майнинг функции, которая, кажется, ничего не делает? функция (х) {х} - person skan; 03.04.2016
comment
моя неспособность выкопать ?identity. Это необходимо, когда вам нужно передать функцию, но вы не хотите, чтобы она что-то делала. Здесь я не хочу здравомыслия. - person baptiste; 03.04.2016
comment
Тогда кому вы передаете функцию? Кажется, я понимаю, так вы выполняете \num{} в каждой ячейке - person skan; 03.04.2016
comment
Представьте, что вы получили таблицу из регрессионной таблицы xtable(lm(...)). Как бы вы применили свой метод к этой таблице? - person skan; 03.04.2016
comment
я мало что знаю о xtable, если честно - person baptiste; 03.04.2016
comment
Я возвращаюсь к этой проблеме. Представьте, что я не определяю свою собственную таблицу, но получаю ее из регрессии и использую xtable для ее создания. ‹‹r, results='asis'››= library(xtable) data(tli) fm2 ‹- lm(tlimth ~ пол*этническая принадлежность, данные = tli) xxx ‹- xtable(fm2) print(xxx, booktabs = TRUE) @ Какие параметры мне нужно использовать в моем файле rnw или коде R для автоматического использования siunitx. Я пробовал \usepackage{siunitx} и несколько \sisetup{}, но, похоже, это не имеет никакого значения. - person skan; 18.11.2016

---
output: pdf_document
---


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

cat(x)

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

введите описание изображения здесь

person rawr    schedule 02.04.2016
comment
Как вы применяете это ко всей таблице или документу? - person skan; 03.04.2016
comment
Представьте, что вы получили таблицу из регрессионной таблицы xtable(lm(...)). Как бы вы применили свой метод к этой таблице? - person skan; 03.04.2016
comment
@skan в примерах, которые я пробовал, xtable преобразовывал научную нотацию в стандартную (например, pvalue 2e-16 в 0,00). поскольку xtable выполняет форматирование и выводит некоторые символы, вам, возможно, придется выполнить вывод и вставить форматирование. для вывода, который вы создаете сами, вы можете применить формат или переопределить метод печати, как предложил баптист. оба из них были бы более грубой силой, чем просто решение options(something = ...) - person rawr; 03.04.2016
comment
Я собираюсь отправить запрос на веб-сайте xtable, чтобы попросить их добавить какую-либо опцию, чтобы сделать это автоматически. - person skan; 03.04.2016

Я думаю, что решение может быть примерно таким

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

Другим вариантом было бы использовать опцию sanitize с gsub.

person skan    schedule 03.04.2016