我想将“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)
----------------------------------
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
```
答案 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)
```
```
--------------------------------------------------------------
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))
```