R Markdown中的网格布局

时间:2019-01-30 13:19:54

标签: r r-markdown

在rmarkdown中是否有一种干净的方法来“平铺”或创建某种类似于表格的布局?例如,在RShiny中,您可以设置排序网格,然后将元素(例如,文本,表格,图表等)放置在这些插槽中,以真正控制外观。如果不是最好的降价方式,我愿意接受HTML,Word或PDF格式的输出。例如,考虑以下文件:

---
title: "Test File"
output: html_document
---

## R Markdown

How do put these side-by-side?

```{r text, echo=FALSE}
summary(cars)
```

```{r plot, echo=FALSE}
plot(speed ~ dist, cars)
```

我可以将summary()输出放在plot()输出旁边吗?如果我想扩展三个范围,该怎么办:plot() | summary() | summary

我也会接受其他格式/构造。我已经尝试过officer,但很难在Word中使这种对齐方式起作用。

2 个答案:

答案 0 :(得分:3)

这是HTML输出的解决方法,它可以自动确定需要多少列。这种方法基于调整 chunk hook 来更改降价输出。我们基本上只执行字符串操作(搜索和替换)。我希望代码中的注释足够干净:

MRE:

---
title: "Test File"
output: html_document
---

## R Markdown

```{r, include = F}
library(stringi)
defChunkHook <- knitr::knit_hooks$get("chunk")
knitr::knit_hooks$set(chunk = function(x, options) {
  x <- defChunkHook(x, options)
  if(!is.null(options$multi.col)) {
    x    <- gsub("(\n\`\`\`\n##.*?\`\`\`)", "<div>\\1\n</div>", x)  # wrap div around output chunks
    x    <- gsub("(<img.*?>)", "<div>\\1\n</div>", x)               # wrap div around plots
    ncol <- nrow(stri_locate_all(x, regex = "<div.*?>")[[1]])       # get the number of div elements created
    x    <- gsub("<div>", paste0("<div style=\"width:", 100/ncol,"%;\">"), x)  # add the width to the divs
    x    <- paste0("<div class=\"multi-col\" style=\"display: flex; justify-content: center; align-items: center;\">\n", x, "</div>")  # wrap the mother div around all of the output
  }
  x
})
```

```{r, echo = F, multi.col=T}
summary(cars)
plot(speed ~ dist, cars)
```

```{r, echo = F, multi.col=T}
summary(cars)
plot(speed ~ dist, cars)
plot(mpg ~ hp, mtcars)
```

enter image description here

答案 1 :(得分:0)

我刚刚发现的另一种解决方法是使用gridExtra。您可以创建图形,文本对象,表格等,然后非常简洁地定义它们的结构和相对位置。

https://cran.r-project.org/web/packages/gridExtra/

优点:易于使用,并带有大量的网格控件。适用于ggplot2

缺点:现在,所有内容都是图像(包括文本)。放入哪些对象方面的灵活性较差。据我所知,没有互动。

因此,我不想将其用于HTML对象。有更好的方法。对于在Word或PDF中相当简单,高度受控的空白使用,这可能是一种可行的方法。