如何在使用knitr/pander生成的报告中设置小数位数?

13

我知道这是一个相当古老的问题,之前已经讨论过,但我无法按预期工作。

我有一个Markdown文档,想要使用knitrpander生成格式一致且小数点后保留两位的数字报告,如0.12、3.60、14.00或163.21,要求内联和块输出都应该保持这种格式。我阅读了How to avoid using round() in every \Sexpr{}?这篇文章,据说可以通过pander自动实现,但对我而言似乎没有起到作用,请告诉我我漏掉了什么。

脚本:

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

但结果并不如我所预期(请注意,小数范围几乎涵盖了0到7之间的所有值):

enter image description here


请参考我在一个非常类似的问题中的答案,以解决使pander始终显示相同小数位数的一般问题的解决方法 :)。链接为https://dev59.com/MJbfa4cB1Zd3GeqPsFMM#47402570 - Salim B
2个回答

17

是的,我有。这个问题在于(1)pander()表格没有受到影响,(2)如果你指定例如model2 = lm(weight~1, chickwts);AIC(model1, model2),我得到的是model1 7 778 model2 2 823,没有小数点,这不仅仅是美学问题。 - sparrow
基本问题是pander不允许您为format()提供nsmall参数。请参见我的答案以获取解决方法 :) - Salim B

8

关于这个问题:

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

关于内联R代码块:也可以在那里调用pander,或者应用一些钩子来自动执行。


更新:这里不需要设置数字位数,因为您要设置的是小数位数,抱歉:

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

进一步更新: 为什么第一次运行时在第二个表格中设置了digits并起作用:

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

而且pandoc.table会按列为基础运行format,因此列中的数字将根据用户请求具有相同数量的小数位数(即使将该选项设置为TRUE时,尾随零也是如此)。

如果您认为这可能是错误,请在GitHub上开启一个问题:https://github.com/Rapporter/pander


亲爱的@daroczig ;)非常感谢您在pander方面所做的出色工作。然而,您的解决方案无法与第一个表一起使用(例如,请参见F值,应为15.36)。有什么想法为什么会这样...? - sparrow
@sparrow 感谢您指出这个问题!我根据直觉刚刚更新了我的回答,但请给我一些时间来思考并睡一觉,明天我一定会回到这个问题上,并思考背后的原因。 - daroczig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接