9

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

このようにして、ドキュメント全体に「パンダー」を手動で書き込む必要がなく、すべてのテーブルを適切にフォーマットできます(ドキュメントに「summary(car)」を20回書き込む必要があると想像してください。「print」を変更すると、節約できます。 pander(summary(car))を書く)。

それは可能ですか?(または私が気付いていないより賢い方法はありますか?)

ありがとう。

更新:.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
```
4

5 に答える 5

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
```
于 2013-03-24T15:31:54.393 に答える
6

将来の読者のために-

ラムナスの答えに基づいて、次のように簡単に使用できます。

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

更新:次のブログ投稿で、上記の質問を動機付ける明確なウォークスルーの例をまとめました-Rを使用してMS-Wordドキュメントを作成します(可能な限りオーバーヘッドを少なくします)

于 2013-03-24T15:59:25.490 に答える
2

現在のところ、を追加するのが最善の方法だと思いますopts_chunk$set(results="asis", render=pander)。これにより、パンダーを使用してすべてのチャンクがレンダリングされます。

例えば

```{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
```
于 2015-11-18T05:57:45.617 に答える
1

別の(現在の回避策)アプローチは、evaluate ::: default_output_handlerをオーバーライドして、ここで説明するように、panderメソッドを持つ結果をパンダライズすることです。

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

このアプローチでは、幸いなことに、「ドキュメント全体に「パンダー」を書き込む必要はありません」または「パンダーで印刷するオブジェクトクラスの印刷メソッドを選択的に無効にする」必要はありません。

于 2014-01-20T09:09:01.570 に答える
0

@malcookの関数に基づいて、誤検知と誤検知を最小限に抑えようとしました。

誤検知は非常に「コストがかかる」可能性があります。ggplot2オブジェクトとdata.frame割り当てでpanderを呼び出すと、knitr / rmarkdownで呼び出されたときに、エラーメッセージなしで終了しないハングが発生しました。パッケージに入れました。

```{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))
```
于 2016-11-25T09:08:10.200 に答える