я пропущу право на пример и комментарии послесловия:Попутных имен данных и столбцов в ggplot через другую функцию
cont <- data.frame(value = c(1:20),variable = c(1:20,(1:20)^1.5,(1:20)^2),group=rep(c(1,2,3),each=20))
value variable group
1 1 1.000000 1
2 2 2.000000 1
3 3 3.000000 1
#... etc.
#ser is shorthand for "series".
plot_scat <- function(data,x,y,ser) {
ggplot(data,aes(x=x,y=y,color=factor(ser)))+geom_point()
}
plot_scat(cont,value,variable,group)
#This gives the error:
#Error in eval(expr,envir,enclose) : object 'x' not found
Теперь я знаю, что ggplot2 имеет известную ошибку, где АЕС() будет только смотреть в глобальной окружающей среды, а не в местной среде. Следуя советам: Use of ggplot() within another function in R, я попробовал другой маршрут.
plot_scat <- function(data,x,y,ser) {
#environment=environment() added
ggplot(data,aes(x=x,y=y,color=factor(ser)),environment=environment())+geom_point()
}
plot_scat(cont,value,variable,group)
#This gives the error:
#Error in eval(expr,envir,enclos) : object 'value' not found
#In addition: Warning message:
#In eval(expr,envir,enclos) : restarting interrupted promise evaluation
Я не знаю, что это за последняя линия означает. Если я звоню: ggplot (cont, aes (x = value, y = variable, color = group)) + geom_point()
Я получаю график, который вы ожидаете. В командной строке aes() ищет имена переменных в ggplot(), но это не делает этого в вызове функции. Поэтому я попытался поменять мой звонок:
plot_scat(cont,cont$value,cont$variable,cont$group)
Это дает мне то, что я хочу. Поэтому я добавляю следующий уровень сложности:
plot_scat <- function(data,x,y,ser) {
#added facet_grid
ggplot(data,aes(x=x,y=y,color=factor(ser)),environment=environment())+geom_point()+
facet_grid(.~ser)
}
plot_scat(cont,cont$value,cont$variable,cont$group)
#This gives the error:
#Error in layout_base(data, cols, drop = drop):
# At least one layer must contain all variables used for facetting
Моей мысль о том, что серы на самом деле продолжение $ группы, которая отлично подходит для использования в AES(), но при передаче facet_grid теперь данные один столбца кадр без информации о значении и переменных. Согласно странице справки, facet_grid не принимает аргумент «data =», поэтому я не могу использовать facet_grid (data = data, ~ ser), чтобы обойти это. Я не знаю, как исходить отсюда.
Это очень простой пример, но долгосрочная цель состоит в том, чтобы иметь функцию, которую я могу дать не-R-грамотным людям в моем офисе, и сказать: «Дайте ей имя фрейма данных, имена столбцов и столбец, который вы хотите разделить, и это сделает для вас красивые сюжеты ». Он также будет намного сложнее, с очень настроенной темой, которая не имеет отношения к проблемам, которые у меня возникают.