2013-11-25 9 views
6

Ich weiß, es ist ein ziemlich altes Problem, und es wurde bereits diskutiert, aber ich kann es nicht funktionieren wie erwartet.Wie wird die Anzahl der Dezimalstellen in Berichten festgelegt, die mit Knitr/Pander erstellt werden?

ich einen Abschlag Dokument habe, und ich mag knitr und pander verwenden, um einen .docx-Bericht mit einem einheitlichen Zahlenformat mit zwei Dezimalstellen zu erzeugen, wie zum Beispiel 0,12, 3,60, 14,00 oder 163,21 für beiden Inline- und Chunk-Ausgaben. Ich habe diesen Thread How to avoid using round() in every \Sexpr{}? gelesen, wo es vorgeschlagen wurde, dass pander das automatisch tun kann. Es scheint jedoch nicht für mich zu funktionieren. Bitte lassen Sie mich wissen, was ich hier vermisse.

Das Skript:

```{r, echo=FALSE} 
library(knitr) 
opts_chunk$set(echo = FALSE, message = FALSE, results = 'asis') 
``` 

```{r} 
require(pander) 
panderOptions('digits' , 2) #this should do the trick, right? 
``` 

Test 
===== 

Let's produce some test stats: 


```{r} 
model1 = lm(weight~feed, chickwts) 
anova.m1 = anova(model1) 
pander(anova.m1) 
pander(coef(summary(model1))) 
``` 

In-line R codes: "Type of food affects body mass of the chicks 
(F~`r anova.m1$Df[1]`,`r anova.m1$Df[2]`~ = `r anova.m1$F[1]`, p = `r anova.m1$Pr[1]`)." 


```{r} 
FILE <- "Test" 
system(paste0("pandoc -o ", FILE, ".docx ", FILE, ".md")) 
``` 

Aber die Ergebnisse sind nicht das, was ich (beachten Sie, dass der Bereich der Dezimalzahlen zwischen 0 ist fast alles und 7) erwarten:

enter image description here

+0

See [meine Antwort] (https://stackoverflow.com/a/47402570/7196903) auf eine sehr ähnliche Frage für dieses Problem zu umgehen zu dem allgemeinen Problem, pander immer Anzeige _the self_ Anzahl der Dezimalstellen :) –

Antwort

6

Was:

> library(pander) 
> panderOptions('digits', 2) 
> panderOptions('round', 2) 
> panderOptions('keep.trailing.zeros', TRUE) 
> pander(anova.m1) 

---------------------------------------------------------- 
    &nbsp;  Df Sum Sq Mean Sq F value Pr(>F) 
--------------- ---- -------- --------- --------- -------- 
    **feed**  5 231129 46226  15  0  

**Residuals** 65 195556 3009      
---------------------------------------------------------- 

Table: Analysis of Variance Table 

> pander(coef(summary(model1))) 

---------------------------------------------------------------- 
     &nbsp;   Estimate Std. Error t value Pr(>|t|) 
------------------- ---------- ------------ --------- ---------- 
    **(Intercept)**  323.58  15.83  20.44  0.00 

**feedhorsebean** -163.38  23.49  -6.96  0.00 

    **feedlinseed** -104.83  22.39  -4.68  0.00 

**feedmeatmeal**  -46.67  22.90  -2.04  0.05 

    **feedsoybean**  -77.15  21.58  -3.58  0.00 

**feedsunflower**  5.33  22.39  0.24  0.81 
---------------------------------------------------------------- 

über Inline-R Brocken: auch pander dort anrufen oder einige Haken anwenden, die automatisch zu tun.


aktualisieren: Es gibt keine Notwendigkeit, die Anzahl der Ziffern hier einstellen, wie Sie nach dem Einstellen der Anzahl der Dezimalstellen sind, sry:

> library(pander) 
> panderOptions('round', 2) 
> panderOptions('keep.trailing.zeros', TRUE) 
> model1 = lm(weight~feed, chickwts) 
> anova.m1 = anova(model1) 
> pander(anova.m1) 

---------------------------------------------------------- 
    &nbsp;  Df Sum Sq Mean Sq F value Pr(>F) 
--------------- ---- -------- --------- --------- -------- 
    **feed**  5 231129 46226  15.36  0  

**Residuals** 65 195556 3009      
---------------------------------------------------------- 

Table: Analysis of Variance Table 

> pander(coef(summary(model1))) 

---------------------------------------------------------------- 
     &nbsp;   Estimate Std. Error t value Pr(>|t|) 
------------------- ---------- ------------ --------- ---------- 
    **(Intercept)**  323.58  15.83  20.44  0.00 

**feedhorsebean** -163.38  23.49  -6.96  0.00 

    **feedlinseed** -104.83  22.39  -4.68  0.00 

**feedmeatmeal**  -46.67  22.90  -2.04  0.05 

    **feedsoybean**  -77.15  21.58  -3.58  0.00 

**feedsunflower**  5.33  22.39  0.24  0.81 
---------------------------------------------------------------- 

Weitere Update: und warum Es funktionierte mit Set digits in der zweiten Tabelle für den ersten Lauf:

> format(c(0.01, 15.36), digits = 2) 
[1] " 0.01" "15.36" 
> format(15.36, digits = 2) 
[1] "15" 

Und pandoc.table läuft format auf einer Spaltenbasis, so dass die Zahlen in einer Spalte basierend auf einer Benutzeranforderung die gleiche Anzahl von Dezimalstellen haben (sogar abschließende Nullen mit dieser Option auf TRUE gesetzt).

Bitte öffnen Sie ein Problem bei GitHub, wenn dies wie ein Bug aussehen: https://github.com/Rapporter/pander

+0

kedves @daroczig;) Vielen Dank und Kudos über den tollen Job mit 'pander'. Ihre Lösung funktioniert jedoch nicht mit der ersten Tabelle (siehe z. B. den F-Wert, der 15.36 sein soll). Irgendwelche Gedanken warum ...? – sparrow

+0

@sparrow danke für meine Aufmerksamkeit auf dieses Problem! Ich habe gerade meine Antworten auf Basis einer schnellen Intuition aktualisiert, aber bitte geben Sie mir etwas Zeit, um darauf zu schlafen, und ich werde auf jeden Fall auf dieses Thema zurückkommen und darüber nachdenken, was im Hintergrund vor sich geht - hoffentlich morgen. – daroczig

9

Sie haben versucht

options(scipen=1, digits=2) 

wie in http://yihui.name/knitr/demo/output/?

+0

Ja, habe ich. Das Problem dabei ist, dass (1) die 'pander()' -Tabellen nicht betroffen sind und (2) wenn Sie z.B. 'model2 = lm (Gewicht ~ 1, chickwts); AIC (model1, model2)' Ich bekomme 'model1 7 778 model2 2 823' ohne Dezimalstellen, was mehr ist als nur ein ästhetisches Problem. – sparrow

+0

Das Grundproblem ist, dass pander es nicht erlaubt, 'format()' ein 'nsmall'-Argument anzugeben. Siehe [meine Antwort] (https://stackoverflow.com/a/47402570/7196903) zu einer sehr ähnlichen Frage für eine Workaround :) –