为什么kable在rmarkdown中的函数中使用时不能打印

时间:2017-02-03 12:59:16

标签: r knitr r-markdown

我必须在许多rmarkdown报告中重复某些输出,并希望编写一个用于此目的的函数。

当我编织rmd文件而不是kable数据帧时,调用函数输出图表。

例如

---
title: "Markdown example"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

# Markdown example
```{r mtcars}
make_outputs <- function(){
  knitr::kable(head(mtcars))
  plot(mtcars$mpg, mtcars$cyl)
  hist(mtcars$cyl)
}

make_outputs()

```

显示绘图但不显示kable表。

4 个答案:

答案 0 :(得分:3)

您可以执行以下操作:使用print打印电缆输出,设置代码块的results="asis",然后使用软件包kable_styling中的kableExtra

这对我有用:

```{r mtcars, results='asis'}

library(kableExtra)
library(knitr)

make_outputs <- function(){
  print(kable_styling(kable(head(mtcars))))
  plot(mtcars$mpg, mtcars$cyl)
  hist(mtcars$cyl)
}

make_outputs()
```

答案 1 :(得分:3)

在列表中使用包含所有对象的return语句可以为您提供帮助,您可以尝试从基数R中使用recordPlotplot来解决您的问题,通过将所有这些图放置在列表中,以获得与您的桌子一起的情节。在return语句中稍微更改了代码,以绘制每个图表以及类似的表格。

选项1: 使用list作为回报,将所有对象绑定在一起,而无需在函数调用中使用lapply

---
title: "Markdown example"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

# Markdown example
```{r mtcars}
make_outputs <- function(){

  return(list(hist(mtcars$cyl), 
              knitr::kable(head(mtcars)),
  plot(mtcars$mpg, mtcars$cyl)))
}

make_outputs()

```    

另一个版本(如果您不希望代码将hist输出输出到html,则可以使用下面的函数来禁止显示。

make_outputs <- function(){

  h1 <- plot(hist(mtcars$cyl, plot=FALSE))
  h2 <- knitr::kable(head(mtcars))
  h3 <- plot(mtcars$mpg, mtcars$cyl)

  return(list(h1, h2, h3))
}

选项2: 另一种(更好的版本是通过在invisible上使用lapply函数来抑制NULL打印,然后在下面的markdown设置中使用 results ='asis'选项,从而提供比以前更清晰的输出

---
title: "Markdown example"
output: html_document
---

knitr::opts_chunk$set(echo = FALSE)
knitr::opts_knit$set(root.dir= normalizePath('..'))
knitr::opts_chunk$set(error = FALSE)

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

# Markdown example
```{r mtcars, results='asis'}
make_outputs <- function(){

  return(list(plot(hist(mtcars$cyl, plot =FALSE)), 
              knitr::kable(head(mtcars)),
  plot(mtcars$mpg, mtcars$cyl)))
}

invisible(lapply(make_outputs(), print))

```   

在针织的html文档中,这给了我一个直方图,一个散点图和一个表格。希望这会有所帮助,不确定是否要这样。如果您有其他需要,请告诉我。

答案 2 :(得分:1)

我也有类似的工作

  • 在函数末尾的return()内部移动knitr :: kable(head(mtcars))。
  • 包括结果='asis'

例如

---
title: "Markdown example"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

# Markdown example
```{r  results = 'asis'}
make_outputs <- function(){

print(plot(mtcars$mpg, mtcars$cyl))
print(hist(mtcars$cyl))

return(knitr::kable(head(mtcars)))
}

make_outputs()

```

如果将ggplot用于绘图,则需要将绘图包装在print()中

答案 3 :(得分:0)

问题似乎与knitr::kable嵌入功能中时错误地检测打印环境有关。这会干扰其正确确定格式的能力。我们可以通过在打印之前将要打印的对象放在顶层环境中来解决这个问题。

---
title: "Markdown example"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
print_kable = function(x) {
  print(kable_print_output <<- x)
  cat('\n')
}
```

# Markdown example
```{r mtcars, results='asis'}
make_outputs <- function() {
  print_kable(knitr::kable(head(mtcars)))
  plot(mtcars$mpg, mtcars$cyl)
  print_kable(knitr::kable(tail(mtcars)))
  }

make_outputs()
```