#r #ggplot2
#r #ggplot2
Вопрос:
Я пытаюсь создать 4 графика с n разными сегментами и точками на каждом, например, скажем, я хочу иметь n = 10
library(gridExtra)
sim.beta=function(a,b,sig,n){
x=runif(n,1,10)
y=a b*x rnorm(n,0,sig)
return(data.frame(x,y))
}
a=10; b=5;sig=20;n=10
grafico=list()
for (i in 1:4) {
s1=sim.beta(a,b,sig,n)
X=s1$x;Y=s1$y
z=qnorm(0.975)
g=ggplot(s1,aes(x,y))
xlim(0,10)
ylim(a-z*sig,a b*10 z*sig)
g=g geom_abline(intercept = a,slope = b,col=2)
mod1=lm(s1$y~s1$x)
for (j in 1:n) {
r11=X[j];r21=a b*r11
g=g geom_segment(aes(x=r11,y=r21 z*sig,xend=r11,yend=r21-z*sig),linetype=2)
g=g geom_point(aes(x[j],y[j]),col=4)
}
g=g geom_abline(aes(intercept=mod1$coefficients[1],slope=mod1$coefficients[2]),col=4,linetype=2)
grafico[[i]]=ggplotGrob(g)
}
grid.arrange(grobs=grafico, ncol=2,nrow=2)
Обратите внимание, что я получаю только 1 сегмент и 1 точку, но я хочу иметь 10, как это с функцией plot:
Ответ №1:
Вы сталкиваетесь с тем фактом, что сопоставления для слоев вычисляются лениво. Это означает, что значение переменной, используемой в цикле, фактически не вычисляется до тех пор, пока не будет отрисован график, а не во время создания слоя. Пользователь может использовать rlang
функции для ввода текущего значения в слой. Часть, которую вам нужно изменить, находится здесь
for (j in 1:n) {
r11=X[j]; r21=a b*r11
g = g geom_segment(aes(x=!!r11, y=!!r21 z*sig, xend=!!r11, yend=!!r21-z*sig), linetype=2)
g = g geom_point(aes(x[!!j], y[!!j]), col=4)
}
Обратите внимание на добавление !!
перед вашими переменными цикла. Это фиксирует их текущие значения.