在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中使这种对齐方式起作用。
答案 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)
```
答案 1 :(得分:0)
我刚刚发现的另一种解决方法是使用gridExtra
。您可以创建图形,文本对象,表格等,然后非常简洁地定义它们的结构和相对位置。
https://cran.r-project.org/web/packages/gridExtra/
优点:易于使用,并带有大量的网格控件。适用于ggplot2
。
缺点:现在,所有内容都是图像(包括文本)。放入哪些对象方面的灵活性较差。据我所知,没有互动。
因此,我不想将其用于HTML对象。有更好的方法。对于在Word或PDF中相当简单,高度受控的空白使用,这可能是一种可行的方法。