2016-04-02 18 views
8

Ich möchte, dass alle Zahlen, die von meinen Knitr-Codes generiert werden, nicht wie ein altmodischer Taschenrechner aussehen.R, Knitr, Rnw, schöne wissenschaftliche Zahlen

enter image description here

Gibt es eine Möglichkeit, die Zahlen wie die letzten zu bekommen (mit · 10 statt e oder E)?

Optionen (scipen = ...) scheint diese Option nicht zu haben.

Ich habe Informationen gesucht und ich habe festgestellt, dass es direkt in LaTeX mit dem Paket siunitx getan werden kann, jede Zahl wie diese \ num zu schreiben {1e-10}

Aber ich mag knitr tat es automatisch für alle Zahlen, einschließlich derjenigen innerhalb der Tabellen.

PD: Und wie kann ich das vermeiden [1], wenn ich etwas drucke?

PD2: Vielleicht etwas mit gsub?

PD3:
Ich komme auf dieses Problem zurück. Stellen Sie sich vor, ich definiere nicht meine eigene Tabelle, aber ich bekomme sie aus einer Regression und benutze xtable, um sie zu erzeugen.

\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} 

Aber es funktioniert nicht gut. Welche Optionen sollte ich verwenden?

Dies ist das Ergebnis nur mit Druck enter image description here

Und das ist das Ergebnis mit Druck + "booktabs = T" + meine Funktion Schönheit(). enter image description here grüße.

Ich weiß nicht, warum es zwei Tabellen statt 1 produziert. Und die Zahlen sind nicht richtig ausgerichtet. Wie auch immer, ich möchte mich nicht auf meine beauty() Funktion verlassen, sondern benutze einfach suintx, wie kann ich das machen?

Antwort

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

Wie wenden Sie es auf eine ganze Tabelle o Dokument an? – skan

+0

Stellen Sie sich vor, Sie haben eine Tabelle aus einer Regressions-xtable (lm (...)). Wie würden Sie Ihre Methode auf diesen Tisch anwenden? – skan

+0

@skan in den Beispielen, die ich versuchte, xtable konvertierte wissenschaftliche Notation zum Standard (zB pvalue 2e-16 zu 0.00).Da xtable die Formatierung ausführt und einige Zeichen ausgibt, müssen Sie möglicherweise die Ausgabe vergrößern und die Formatierung einfügen. Für die Ausgabe, die Sie selbst erstellen, können Sie das Format anwenden oder die Druckmethode überschreiben, wie es Baptiste vorgeschlagen hat. beides wäre brutaler als nur eine 'options (something = ...)' Lösung – rawr

9

Ich ziehe es die Formatierung siunitx, aber die Vorverarbeitung in R verlassen kann ein wenig knifflig,

--- 
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

Was ist das Mining einer Funktion, die nichts zu tun scheint? "Funktion (x) {x}" – skan

+0

mein Versagen, "Identität" auszugraben. Es ist erforderlich, wenn Sie eine Funktion übergeben müssen, aber nicht möchten, dass sie etwas tut. Hier will ich keine Vernunft. – baptiste

+0

Wem übergeben Sie dann die Funktion? Ich denke, ich verstehe, das ist die Art, wie Sie \ num {} auf jeder Zelle ausführen – skan

0

ich die Lösung denken bekommen könnte so etwas sein

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")) 

Es ist sowieso nicht perfekt. Wenn jemand es optimieren kann, wäre es großartig. Anyway Ich habe eine Anfrage an xtable geschickt, um diese Funktion hinzuzufügen, aber es scheint in letzter Zeit nicht viel Entwicklung zu sein.

Eine andere Option wäre die Verwendung der Sanitize-Option mit gsub.

Verwandte Themen