如何在R中通过字符向量选择对象,批量导出ggplot图形?
解决批量将命名ggplot对象存入列表用于ggexport的问题
我完全懂你这种手动输入上百个图形对象名的痛苦,之前用paste0生成的字符向量没法直接转成图形对象列表确实让人头疼。其实有个超简洁的函数能直接搞定这个问题——mget()。
正确做法
直接用mget()根据生成的对象名字符向量,批量抓取对应的图形对象:
# 一次性获取p1到p100的图形对象,生成符合要求的列表 plot_list <- mget(paste0("p", 1:100)) # 直接传入ggexport导出即可 ggexport(plotlist = plot_list, filename = 'test.pdf')
为什么之前的方法行不通?
咱们挨个拆解你尝试过的方法问题在哪:
list(paste0('p',1:2)):生成的是装着字符向量的列表,里面存的是"p1"、"p2"这类字符串,不是实际的ggplot对象,ggexport根本识别不了。parse(paste0('p',1:2)):只是把字符串转换成了表达式(比如expression(p1, p2)),并没有真正获取到对应的图形对象。eval(parse(paste0('p',1:2))):parse处理多个对象名会生成多个表达式,但eval默认只执行第一个,所以只能拿到单个图形。syms(paste0('p',1:2)):生成的是符号对象列表,得结合purrr::map(eval)才能转成实际对象,比mget麻烦多了。get(paste0('p',1:2)):get只能接受单个对象名,传入向量会直接报错,根本没法批量获取。
完整示例验证
用3个图形做演示,你可以直接套用逻辑到100个图形上:
library(ggplot2) library(ggpubr) # 别忘了加载ggexport所属的ggpubr包 # 先生成几个示例图形 p1 <- qplot(data = mtcars, x = cyl) p2 <- qplot(data = mtcars, x = cyl, y = mpg) p3 <- qplot(data = mtcars, x = hp, y = mpg) # 批量获取图形列表 plot_list <- mget(paste0("p", 1:3)) # 导出到PDF ggexport(plotlist = plot_list, filename = 'test.pdf')
mget()会自动在当前环境(默认是全局环境)里查找所有指定名称的对象,返回的列表每个元素就是对应的ggplot对象,完美匹配ggexport的要求。如果你的图形对象存在其他环境中,还能通过envir参数指定查找环境,比如mget(paste0("p",1:100), envir = .GlobalEnv)。
内容的提问来源于stack exchange,提问作者zhiwei li
相关产品推荐
相关产品推荐

