【问题标题】:Create multiple plots with unique RMarkdown headers创建具有唯一 RMarkdown 标头的多个图
【发布时间】:2014-10-21 12:44:13
【问题描述】:

在 R 中使用spineplot,我正在尝试创建一系列图表,将一些潜在的协变量与年龄类别进行比较,以便我们可以进行一些初步的数据探索。我在 R Markdown 中编写了这段代码,我正在使用 RStudio 将文件编织成 HTML 输出。但是,我很难让我的循环生成的每个图都具有适当的 RMarkdown 标头。我尝试将cat("## my header") 放在生成每个图的循环中,但由于某种原因,它只显示在第一个图上,而不是其余部分。它打印出其余部分,但不会被解释为 Markdown。

这是我的代码示例:

---
title: "Minimal Working Example"
author: "TARehman"
date: "Wednesday, August 27, 2014"
output:
  html_document:
    toc: yes
---

# Spineplots
```{r mwe, echo=FALSE, results='asis', fig.height=5, fig.width=8, dpi=300}
tempdata <- data.frame(age=c("0-1","0-1","1-3","1-3","3-7","10-15","3-7","7-10"),
                       covA=c("Class 0","Class 1","Class 3","Class 2","Class 4","Class 3","Class 1","Class 2"),
                       covB=c("Class 1","Class 3","Class 2","Class 4","Class 4","Class 1","Class 1","Class 0"),
                       covC=c("Class 3","Class 3","Class 2","Class 3","Class 1","Class 4","Class 4","Class 4"))

temp_covars <- c("covA","covB","covC")

temp_locvec <- c(0.1,0.3,0.5,0.7,0.9)
temp_labvec <- c("0-1","1-3","3-7","7-10","10-15")
temp_colvec <- rainbow(n = 5,start = 7/12,end = 9/12,alpha = 0.8)

for(x in temp_covars) {

    cat(paste("## Spineplot of",x,"vs. age groups\n",sep=" "))

    spineplot(x = tempdata[[x]],
              y = tempdata$age,
              ylab = "Age Group",
              xlab = "Class",
              col = temp_colvec,
              off = 0,
              yaxlabels = c(NA,NA,NA,NA,NA),
              main = paste("Classes of",x,"versus age groups",sep=" "))

    for(j in 1:5) {
        axis(side = 2,
             at = temp_locvec[j],
             labels = temp_labvec[j],
             col.axis = temp_colvec[j],
             font.axis = 2)
        }
    rm(j)
}
rm(list=c("x","temp_locvec","temp_labvec","temp_colvec"))
```

输出如下所示。

【问题讨论】:

  • 如果将输出设置为md_document,就会出现问题:##变成\#\#
  • 为什么只在后续循环中?有没有办法防止这样的事情发生?
  • 这看起来像一个错误。如果您在每个绘图后添加空行,它就会起作用。
  • 哇。确实如此。我一直在这样做,但最后我只添加了一个换行符。当我添加两个换行符时它起作用了。
  • 你能在下面回答你自己的问题吗?

标签: r plot knitr rstudio r-markdown


【解决方案1】:

原来你需要一个额外的回车。正如 Yihui 所指出的,一个 header 之前需要一个空行才能被 Markdown 正确解释。在我的循环末尾添加一个简单的 cat("\n\n") 可以解决问题。

我曾尝试只添加一个换行符,但错过了需要两个换行符才能正确解释标题。

---
title: "Working Solution"
author: "TARehman"
date: "September 3, 2014"
output:
  html_document:
    toc: yes
---

# Spineplots
```{r mwe, echo=FALSE, results='asis', fig.height=5, fig.width=8, dpi=300}
tempdata <- data.frame(age=c("0-1","0-1","1-3","1-3","3-7","10-15","3-7","7-10"),
                       covA=c("Class 0","Class 1","Class 3","Class 2","Class 4","Class 3","Class 1","Class 2"),
                       covB=c("Class 1","Class 3","Class 2","Class 4","Class 4","Class 1","Class 1","Class 0"),
                       covC=c("Class 3","Class 3","Class 2","Class 3","Class 1","Class 4","Class 4","Class 4"))

temp_covars <- c("covA","covB","covC")

temp_locvec <- c(0.1,0.3,0.5,0.7,0.9)
temp_labvec <- c("0-1","1-3","3-7","7-10","10-15")
temp_colvec <- rainbow(n = 5,start = 7/12,end = 9/12,alpha = 0.8)

for(x in temp_covars) {

    cat(paste("## Spineplot of",x,"vs. age groups\n",sep=" "))

    spineplot(x = tempdata[[x]],
              y = tempdata$age,
              ylab = "Age Group",
              xlab = "Class",
              col = temp_colvec,
              off = 0,
              yaxlabels = c(NA,NA,NA,NA,NA),
              main = paste("Classes of",x,"versus age groups",sep=" "))

    for(j in 1:5) {
        axis(side = 2,
             at = temp_locvec[j],
             labels = temp_labvec[j],
             col.axis = temp_colvec[j],
             font.axis = 2)
        }
    rm(j)
    cat("\n\n")
}
rm(list=c("x","temp_locvec","temp_labvec","temp_colvec"))
```

【讨论】:

  • 我一直在尝试几个人的示例代码,但我无法解决一个奇怪的问题:第一个和第二个标题出现在 html 文件中,然后是第一个情节,然后是第三个标题,然后是第二个情节,然后是“NA”,然后是第三个情节。有什么办法解决这个问题?
  • @Nova 我建议提出一个新问题,然后在其中创建您的示例。这样做你会得到更好的回应。
  • 对这个问题还没有兴趣,我还在为它苦苦挣扎! stackoverflow.com/questions/44595377/…
【解决方案2】:

我贴一个我为another question准备的简短示例:

```{r, results='asis'}
cat("\n\n## Title")
for (s in unique(cars$speed)){
    cat("\n\n### speed",s)
}
```

我在the other question 中删除了该示例,因为它使用的是降价语法并且不适合 Latex/Rnw 主题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多