如何保存含未保存变量定义的ggplot对象并正常加载使用?
解决ggplot对象保存后加载依赖变量缺失的问题
问题根源确实是ggplot的延迟求值机制:aes()里的表达式不会在创建图层时立即计算,而是等到实际绘图时才去当前环境查找变量。你代码里aes(x=1:var1)存的是“调用var1生成序列”的表达式,不是具体的数值序列,所以加载后找不到var1就报错了。
下面给两个便捷的解决方法,不用保存依赖变量:
方法一:把x变量提前加入数据框(推荐)
这是最符合ggplot设计逻辑的做法,把所有用到的变量都放在绑定到ggplot对象的数据框里,彻底避免外部依赖。修改代码如下:library(ggplot2) var1 <- 100 datfram <- data.frame( x = 1:var1, # 直接生成x列存入数据框 y = rnorm(var1) ) ggp1 <- ggplot(datfram) + geom_point(aes(x=x, y=y)) save(ggp1, file='temp.rdata') load(file='temp.rdata') ggp1 # 加载后直接正常绘图方法二:用
!!强制求值,固化表达式结果
在aes()里用!!运算符,把1:var1强制计算成具体的数值序列,这样ggplot对象里存储的就是实际的向量,而不是需要依赖var1的表达式。代码修改如下:library(ggplot2) var1 <- 100 datfram <- data.frame(y=rnorm(var1)) ggp1 <- ggplot(datfram) + geom_point(aes(x=!!(1:var1), y=y)) # 强制求值 save(ggp1, file='temp.rdata') load(file='temp.rdata') ggp1 # 加载后正常绘图
内容的提问来源于stack exchange,提问作者Joonha Park
相关产品推荐
相关产品推荐

