【问题标题】:How to save several plots from an own function into a list in R?如何将多个图从自己的函数保存到 R 中的列表中?
【发布时间】:2026-02-06 07:15:01
【问题描述】:

我创建了一个函数,它包含两种类型的图,它会给你一张图像。但是,此图像的标题会根据一个列表而变化,因此,您将有多个绘图但标题不同。 (原始函数会更改绘图使用的数字,但本质上是我需要的)。

这是我创建的示例。

list_genes <- c("GEN1", "GEN2", "GEN3")


myfunction <- function(x,y){
  
  for(gene in list_genes){
    # This to draw both plots
      par(mfrow=c(2,1))  
      
      plot(x,y, main=paste0("Plot of ", gene))
      
      hist(x, main=paste0("Plot of ", gene))
  }
}

myfunction(x=c(1,5,6,2,4),y=c(6,10,53,1,5))

由于列表有 3 个元素,我们得到 3 个图。

但是,由于我需要使用我生成的所有绘图创建一个演示文稿,我发现这个post 有一个解决方案,可以在 for 循环中为多个绘图创建幻灯片。这是我想要的,但为此,我需要将我的图保存到列表/变量中。

object <- myfunction(x=c(1,5,6,2,4),y=c(6,10,53,1,5))
> object
NULL

我找到了这个post(它为您提供了一个有趣的解决方案)但是,这些图仍然无法保存到一个对象中。

calling_myfunc <- function(){
  myfunction(x=c(1,5,6,2,4),y=c(6,10,53,1,5))
}

calling_myfunc()

object <- calling_myfunc()
> object
NULL

我的最终目标是(自动)创建一个演示文稿,其中包含我从我的函数生成的所有图。正如我在post 中看到的那样。但我需要将图保存到变量中。

谁能帮我解决这个问题?

提前非常感谢

【问题讨论】:

  • 不幸的是,基本 R 绘图并没有一个很好的机制来保存绘图对象(有一种通过 recordPlot 的方法,如您链接的帖子中所示,但它相当复杂)。相比之下,“ggplot2”使这变得微不足道。因此,我强烈建议您使用“ggplot2”。
  • @Konrad Rudolph 我试过recordPlot,但我真的不知道它是如何工作的。它再次生成图,但显示了第一个图。在我添加的示例中,它显示了 3 个图,然后是一个空图像,然后是第三个图。我真的不知道它是如何工作的。在我的原始函数中,我使用函数 stripchart() 和 hist()。我不知道基础 R 绘图在保存对象时存在问题...

标签: r function plot histogram ioslides


【解决方案1】:

虽然我找不到将绘图保存到对象中的方法,但由于postexport 包,我找到了一种使用这些图像创建演示文稿的方法。

library(export) 

list_genes <- c("GEN1", "GEN2", "GEN3")


myfunction <- function(x,y){
     for(gene in list_genes){
    # This to draw both plots
      par(mfrow=c(2,1))  
      
      plot(x,y, main=paste0("Plot of ", gene))
      
      hist(x, main=paste0("Plot of ", gene))
      graph2ppt(file="plots.pptx", width=6, height=5,append=TRUE)    } }

myfunction(x=c(1,5,6,2,4),y=c(6,10,53,1,5))

当然,地块的宽度和高度是可以改变的,或者把它们作为参数放在函数中。

由于我当前的 R 版本 (4.1.2) 在 CRAN 中没有可用的包,我从 GitHub 下载了它: devtools::install_github("tomwenseleers/export")

另外,我找到了另一个可以用于相同目的的包(虽然它在开头添加了一张额外的幻灯片,但我不知道为什么)

library(eoffice)

list_genes <- c("GEN1", "GEN2", "GEN3")


myfunction <- function(x,y){
  
  for(gene in list_genes){
    # This to draw both plots
      par(mfrow=c(2,1))  
      
      plot(x,y, main=paste0("Plot of ", gene))
      
      hist(x, main=paste0("Plot of ", gene))
      topptx(file="plots.pptx", width=6, height=5,append=TRUE) 
  }
}

myfunction(x=c(1,5,6,2,4),y=c(6,10,53,1,5))

PS:我找到了创建演示文稿的解决方案 --> How to create a presentation in R with several plots obtained by a function?

【讨论】: