How to set the number of decimals in report produced with knitr/pander?
Asked Answered
N

2

13

I know it's a fairly old problem, and it has been discussed before, but I can't get it work as expected.

I have a markdown document, and I would like to use knitr and pander to produce a .docx report with a consistent numeric format with two decimals, such as 0.12, 3.60, 14.00, or 163.21 for both inline and chunk outputs. I have read this thread How to avoid using round() in every \Sexpr{}? where it was suggested that pander can do that automatically. However, it does not seem to work for me. Please let me know what I'm missing here.

The script:

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

But the results are not what I would expect (note that the range of decimals is almost everything between 0 and 7):

enter image description here

Nightlong answered 25/11, 2013 at 17:18 Comment(1)
See my answer to a very similar question for a workaround to the general problem of making pander always display the same number of decimal places :)Anecdotage
Y
8

What about:

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

About inline R chunks: also call pander there or apply some hooks to do that automatically.


Update: there's no need to set the number of digits here as you are after setting the number of decimals, 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   
----------------------------------------------------------------

Further update: and why it worked with set digits in the second table for the first run:

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

And pandoc.table runs format on a column-basis so that the numbers in a column would have the same number of decimals (even trailing zeros with that option set to TRUE) based on a user-request.

Please open an issue at GitHub if this would look like a bug: https://github.com/Rapporter/pander

Yalu answered 25/11, 2013 at 19:8 Comment(2)
kedves @Yalu ;) thanks a lot and kudos on the great job with pander. However, your solution doesn't work with the first table (see e.g. the F-value, which is supposed to be 15.36) Any thoughts why...?Nightlong
@Nightlong thanks for pointing my attention to this issue! I've just updated my answered based on a quick intuition, but pls give me some time to sleep on it, and I will definitely get back to this issue and think about what's going on in the background - hopefully tomorrow.Yalu
D
17

Have you tried

 options(scipen=1, digits=2)

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

Dubenko answered 25/11, 2013 at 18:6 Comment(2)
Yes, I have. The problem with this is that (1) the pander() tables are unaffected and (2) if you specify e.g. model2 = lm(weight~1, chickwts);AIC(model1, model2) I get model1 7 778 model2 2 823 without the decimals, which is more than just an aesthetic problem.Nightlong
The basic problem is pander doesn't allow you to provide format() an nsmall argument. See my answer to a very similar question for a workaround :)Anecdotage
Y
8

What about:

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

About inline R chunks: also call pander there or apply some hooks to do that automatically.


Update: there's no need to set the number of digits here as you are after setting the number of decimals, 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   
----------------------------------------------------------------

Further update: and why it worked with set digits in the second table for the first run:

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

And pandoc.table runs format on a column-basis so that the numbers in a column would have the same number of decimals (even trailing zeros with that option set to TRUE) based on a user-request.

Please open an issue at GitHub if this would look like a bug: https://github.com/Rapporter/pander

Yalu answered 25/11, 2013 at 19:8 Comment(2)
kedves @Yalu ;) thanks a lot and kudos on the great job with pander. However, your solution doesn't work with the first table (see e.g. the F-value, which is supposed to be 15.36) Any thoughts why...?Nightlong
@Nightlong thanks for pointing my attention to this issue! I've just updated my answered based on a quick intuition, but pls give me some time to sleep on it, and I will definitely get back to this issue and think about what's going on in the background - hopefully tomorrow.Yalu

© 2022 - 2024 — McMap. All rights reserved.