ggplot
推迟对aes
的评估,直到绘制图表为止。如果ggplot
在本地环境中用于定义图形,但稍后在全局环境中绘制图形,则为known problem。但即使在全球环境中,如果在aes
中使用临时变量,后来更改其值或不再存在,也可能会导致问题。这是一个例子:
df <- data.frame( a = 1:100,
b1 = sin(0.1*(1:100)),
b2 = cos(0.1*(1:100)) )
v <- c( "curve 1", "curve 2" )
plt <- ggplot( NULL ) +
geom_line( data = df,
size = 1.5,
aes( x=a, y=b1, colour=v[1] ) ) +
geom_line( data = df,
size = 1.5,
aes( x=a, y=b2, colour=v[2] ) ) +
theme( legend.title = element_blank(),
legend.text=element_text(size=30) )
到目前为止plt
按预期显示图表。但是如果删除v
,则会发生以下错误:
> rm(v)
> plt
Error in eval(expr, envir, enclos) : object 'v' not found
>
在这种情况下捕获(全球)环境并不起作用。到目前为止我找到的唯一解决方案如下:
library(ggplot2)
df <- data.frame( a = 1:100,
b1 = sin(0.1*(1:100)),
b2 = cos(0.1*(1:100)) )
v <- c( "curve 1", "curve 2" )
aes1 <- aes( x=a, y=b1, colour=v[1] )
aes2 <- aes( x=a, y=b2, colour=v[2] )
aes1$colour <- v[1]
aes2$colour <- v[2]
plt <- ggplot( NULL ) +
geom_line( data=df, size=1.5, aes1 ) +
geom_line( data=df, size=1.5, aes2 ) +
theme( legend.title = element_blank(),
legend.text=element_text(size=30) )
现在几乎所有东西都可以删除:
> rm(v,aes1,aes2,df)
> plt
>
有没有更优雅的方法来解决这个问题?