【发布时间】:2014-04-12 19:24:08
【问题描述】:
考虑在函数内部使用ggplot(...)。
x <- seq(1,10,by=0.1)
df <- data.frame(x,y1=x, y2=cos(2*x)/(1+x))
library(ggplot2)
gg.fun <- function(){
i=2
plot(ggplot(df,aes(x=x,y=df[,i]))+geom_line())
}
if(exists("i")) remove(i)
gg.fun()
# Error in `[.data.frame`(df, , i) : object 'i' not found
i=3
gg.fun() # plots df[,3] vs. x
看起来ggplot 无法识别函数内部定义的变量i,但确实 识别i(如果它是在全局环境中定义的)。这是为什么呢?
请注意,这给出了预期的结果。
gg.new <- function(){
i=2
plot(ggplot(data.frame(x=df$x,y=df[,i]),aes(x,y)) + geom_line())
}
if(exists("i")) remove(i)
gg.new() # plots df[,2] vs. x
i=3
gg.new() # also plots df[,2] vs. x
【问题讨论】:
-
你可以使用
aes_string来传递参数吗? -
@RomanLuštrik - 谢谢,但我永远不会像这样使用
aes(...);我会用第二种方法。我试图了解发生了什么。这是一个错误吗?或者这种行为有充分的理由吗?还是我只是做错了什么? -
这可能与我的问题有关吗? stackoverflow.com/questions/23482036/…我在那里试过你的方法,但没有解决。
标签: r ggplot2 nse standard-evaluation non-standard-evaluation