在knitr chunk评估中替换“print”函数

时间:2013-03-24 14:56:53

标签: r knitr r-markdown

我想将“pander”功能设置为编辑knitr rmarkdown文档时的替代“打印”功能。像这样(在R中运行的代码示例):

require(pander)
print <- function(...) pander(..., style = "rmarkdown") # makes sure that everyhing that everyprint will pass through pander
summary(cars)

这将导致:

> summary(cars)

----------------------------------
&nbsp;    speed          dist     
------ ------------ --------------
 ****  Min.  : 4.0   Min.  : 2.00 

 ****  1st Qu.:12.0 1st Qu.: 26.00

 ****  Median :15.0 Median : 36.00

 ****   Mean :15.4   Mean : 42.98 

 ****  3rd Qu.:19.0 3rd Qu.: 56.00

 ****  Max.  :25.0  Max.  :120.00 
----------------------------------

这样,我会将所有表格格式化,而不是手动需要在整个文档中编写“pander”(想象一下我必须在文档中写“摘要(car)20次,更改”print“将节省我写作pander(摘要(汽车)))。

这可能吗? (还是有一种我不知道的更聪明的方式?)

感谢。

更新:.rmd文件的示例:

TEST
====

```{r}

require(pander)
print <- function(...) pander(..., style = "rmarkdown") # makes sure that everyhing that everyprint will pass through pander

summary(cars)
```


```{r, eval=FALSE}
library(knitr)
knit2html("test.rmd") # http://stackoverflow.com/questions/10646665/how-to-convert-r-markdown-to-html-i-e-what-does-knit-html-do-in-rstudio-0-9
# http://quantifyingmemory.blogspot.co.il/2013/02/reproducible-research-with-r-knitr.html
```

输出test.md为:

TEST
====




```r

require(pander)
print <- function(...) pander(..., style = "rmarkdown")  # makes sure that everyhing that everyprint will pass through pander

summary(cars)
```

```
##      speed           dist    
##  Min.   : 4.0   Min.   :  2  
##  1st Qu.:12.0   1st Qu.: 26  
##  Median :15.0   Median : 36  
##  Mean   :15.4   Mean   : 43  
##  3rd Qu.:19.0   3rd Qu.: 56  
##  Max.   :25.0   Max.   :120
```






```r
library(knitr)
knit2html("test.rmd")  # http://stackoverflow.com/questions/10646665/how-to-convert-r-markdown-to-html-i-e-what-does-knit-html-do-in-rstudio-0-9
#
# http://quantifyingmemory.blogspot.co.il/2013/02/reproducible-research-with-r-knitr.html
```

5 个答案:

答案 0 :(得分:7)

您需要有选择地否决要使用pander打印的对象类的print方法。请methods(pander)找出可用的内容。某些方法未导出,因此您必须使用:::来访问它们。这是一个简单的例子。

TEST
====

```{r cache = F, comment = NA}
print.lm <- pander:::pander.lm
lm(mpg ~ wt, data = mtcars)
```

输出

TEST
====


```r
print.lm <- pander:::pander.lm
lm(mpg ~ wt, data = mtcars)
```

```

--------------------------------------------------------------
           &nbsp;  Estimate   Std. Error   t value   Pr(>|t|) 
----------------- ---------- ------------ --------- ----------
  **(Intercept)**   37.29       1.878       19.86   8.242e-19 

           **wt**   -5.344      0.5591     -9.559   1.294e-10 
--------------------------------------------------------------

Table: Fitting linear model: mpg ~ wt
```

答案 1 :(得分:6)

对于未来的读者 -

根据Ramnath的回答,可以简单地使用:

require(pander)
print <- function (x, ...) UseMethod("pander")

更新:我在下面的博客文章中汇集了一个明确的演示示例,激发了上述问题 - Write MS-Word document using R (with as little overhead as possible)

答案 2 :(得分:1)

另一种(当前的解决方法)方法是覆盖evaluate ::: default_output_handler来泛化具有pander方法的结果,如下所述:

https://github.com/yihui/knitr/issues/484#issuecomment-32705187

这种方法很愉快,不需要“需要编写”整个文档中的“整个”或“有选择地否决了要使用pander打印的对象类的打印方法”。

答案 3 :(得分:1)

我认为目前最好的选择是添加opts_chunk$set(results="asis", render=pander)。然后,这将使用pander呈现所有块。

e.g。

```{r set_knitr_chunk_options, echo=FALSE, message=FALSE}
require(knitr)
require(pander)
opts_chunk$set(results = "asis", render=pander) # important for making sure the output will be well formatted.
```

```{r}
USJudgeRatings
```

答案 4 :(得分:0)

我试图在@ malcook function的基础上尽量减少误报和否定。

误报可能非常“昂贵”:在knitr / rmarkdown中调用时,在ggplot2对象和data.frame分配上调用pander会导致永不停止的挂起而没有错误消息。我输了一个package

```{r}
pander_handler = function(x, ..., row.names = FALSE, dont_transform = c("knit_asis")) {
    anyS3method = function(x) {
        classes = class(x)
        any(
            sapply(classes, FUN = function(classes) {
                !is.null(utils::getS3method('pander',classes, TRUE, environment(pander::pander)))
            })
        )
    }
    if (length(intersect(dont_transform, class(x))) == 0 && anyS3method(x)) {
        pander::pander(x, row.names = row.names, ...) # if pander has a method, we use it
    } else {
        res = withVisible(knitr::knit_print(x, ...))
        # indicate the htmlwidget result with a special class so we can attach
        # the figure caption to it later in wrap.knit_asis
        if (inherits(x, 'htmlwidget'))
            class(res$value) = c(class(res$value), 'knit_asis_htmlwidget')
        if (res$visible) res$value else invisible(res$value)
    }

}

opts_chunk$set(render = pander_handler)
```

```{r}
library(data.table)
library(pander)
library(knitr)
library(ggplot2)
qplot(1:2)
plot(1:2)
xtabs(~ mpg + cyl, data = mtcars)
table(mtcars$cyl)
"blabla"
```

```{r}
xy = data.frame(x = 1:2, y = 3:4)
xy
```


```{r}
xx = data.table(xy)
xx[, new := 3:4]
```

```{r}
pander(xtabs(~ y, data = xx), caption = "y")
```


```{r}
library(lme4)
summary(lmer(Reaction ~ Days + (Days | Subject), sleepstudy))
summary(lm(Reaction ~ Days, sleepstudy))
```
相关问题