如何在R Markdown的列表中打印所有记录的图

plicqrtu  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(123)

这是我在StackOverflow上的第一个问题。2如果我做错了什么,让我知道如何改进下一个问题。
我从RMarkdown开始,我在用for循环打印记录的图时遇到了一些麻烦。在运行RMarkdown文件之前,我运行了一个R函数,它生成了一个包含几个 Dataframe 和图的列表。
为了使它更容易,我在这里放了一个简单的可复制的例子,这个列表只是与绘图对象。

x <- c(1,2,3,4,5)
y <- c(1,2,3,4,5)

plot(x,y)
abline(h=1)
p1.1 <- recordPlot()

plot(x,y)
abline(h=3)
p1.2 <- recordPlot()

plot(x,y)
abline(h=4)
p2.1 <- recordPlot()

plot(x,y)
abline(h=6)
p2.2 <- recordPlot()

lista<-NULL
lista["p1.1"] <- list(p1.1)
lista["p1.2"] <- list(p1.2)
lista["p2.1"] <- list(p2.1)
lista["p2.2"] <- list(p2.2)

save(new_list, file = "Data.RData")

然后我把这个列表加载到R Markdown文件中,如下所示:

```{r setup}
knitr::opts_chunk$set(echo = TRUE,fig.keep = "all")
load("Data.RData")```

我试着把这些图打印成这样

```{r,echo=FALSE, results='asis',fig.keep='all'}
for (i in c(1,2)){
 for(j in c(1,2)){
  print(lista[[paste(paste("p",i,sep=""),j,sep=".")]])
 }
}```

当我运行Knitr获取HTML文件时,结果是只显示了for循环的最后一个图。
我试过用lapply代替for循环,但它对我不起作用。我也试过用replayplot函数print(replayPlot(lista[[paste(paste(paste("p",i,sep=""),".",sep=""),j,sep="")]])),结果也一样。
有没有办法解决这个问题而不修改以前生成绘图列表的R函数?
谢谢你的回答。

pepwfjgg

pepwfjgg1#

对于ggplot对象的列表,您使用的语法可能没有问题,但对于基本plot对象,您需要调用plot.new(),以便列表中的下一个图不会覆盖前一个图:

---
title: "test"
output: html_document
---

## Define plots

```{r}
x <- c(1,2,3,4,5)
y <- c(1,2,3,4,5)

plot.new()
plot(x,y)
abline(h=1)
p1.1 <- recordPlot()

plot.new()
plot(x,y)
abline(h=3)
p1.2 <- recordPlot()

plot.new()
plot(x,y)
abline(h=4)
p2.1 <- recordPlot()

plot.new()
plot(x,y)
abline(h=6)
p2.2 <- recordPlot()

lista<-NULL
lista["p1.1"] <- list(p1.1)
lista["p1.2"] <- list(p1.2)
lista["p2.1"] <- list(p2.1)
lista["p2.2"] <- list(p2.2)

Print list

for (i in c(1,2)){
 for(j in c(1,2)){
  # Needed to avoid overwrite
  plot.new()
  print(lista[[paste(paste("p",i,sep=""),j,sep=".")]])
 }
}

请注意,您可以简化循环的语法:

for(p in lista) {
plot.new()
print(p)
}

yruzcnhs

yruzcnhs2#

你不需要一个循环来绘制保存在列表中的每一个ggplot。

```{r,echo=FALSE}
  print(lista)

这会自动将列表中的每个元素(每个图)绘制到Markdown。

相关问题