2016-04-02 13 views
8

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

enter image description here

Есть ли возможность получить номера, как последний (с · 10 вместо й или Е)?

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

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

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

Это результат только с печатью enter image description here

И это результат с печатью + «booktabs = Т» + моя функция красоты(). enter image description here Отношения.

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

ответ

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

+0

Как вы примените его к целому столу документа? – skan

+0

Представьте, что у вас есть таблица из регрессии xtable (lm (...)). Как вы примените свой метод к этой таблице? – skan

+0

@skan в примерах, которые я пробовал, xtable преобразовал научную нотацию в стандартную (например, значение 2е-16 до 0,00).поскольку xtable делает форматирование и распечатывает некоторые символы, тогда вам может понадобиться выполнить grep вывод и вставить форматирование. для вывода, который вы создаете самостоятельно, вы можете применить формат или переопределить метод печати, например, предложенный baptiste. оба из них были бы более грубой силой, чем просто 'options (something = ...)' solution – rawr

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

+0

Какова разработка функции, которая ничего не делает? "function (x) {x}" – skan

+0

Не удалось выкопать '? identity'. Это необходимо, когда вам нужно передать функцию, но не хотите, чтобы она ничего не делала. Здесь я не хочу здравого смысла. – baptiste

+0

После чего вы передаете функцию? Думаю, я понимаю, что вы выполняете \ num {} на каждой ячейке – 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")) 

В любом случае это не так. Если кто-нибудь может его оптимизировать, было бы здорово. В любом случае, я отправил запрос на возможность добавления этой функции, но в последнее время это не так много.

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