Итак, я пытаюсь разработать функцию построения графика на основе для существующего пакета R. Пользователи должны иметь возможность указывать фрейм данных (datfile), значение, в котором вертикальная линия помещается в график (альфа), и переменную (группу) группировки для создания подзаголовков через огранку.Ошибка создания граней в функции построения на основе ggplot2
Вот несколько примеров данных:
#Some hypothetical data
Computed=c(0.03, 0.25, 0.74, 0.02, 0.0023, 0.43, 0.56, 0.32, 0.005, 0.0032, 0.06)
Reported.P.Value=c(0.25, 0.24, 0.74, 0.01, 0.001, 0.40, 0.56, 0.32, 0.003, 0.0032, 0.02)
Journal=c("a", "b","a", "b","a", "b","a", "b","a", "b","a")
dat=data.frame(Computed, Reported.P.Value, Journal)
Функция выглядит следующим образом:
plot1 <- function(datfile, alpha, group){
p <- ggplot(datfile, aes(y = Computed,x = Reported.P.Value))
p + geom_point(size=2.5)+
geom_vline(xintercept=alpha, color="grey60",linetype="dashed")+
geom_abline(intercept=0, slope=1, color="grey60")+
annotate("text", x= 0.5, y = .10, label="overestimated")+
annotate("text", x= 0.5, y = .90, label="underestimated")+
scale_x_continuous(name="Reported p-values", breaks=c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0))+
scale_y_continuous(name="Computed p-values", breaks=c(0.00, 0.05, 0.10, 0.25, 0.50, 0.75, 1.0))+
facet_grid(group ~ .)
}
Если я игнорирую функцию, и просто выполнить код Plotting себя (подставляя в соответствующие векторы из кадр данных), все работает нормально:
Но если попытаться запустить функцию, функция построения самой ...:
plot1(dat, 0.05, Journal)
Я получаю сообщение об ошибке: Error in layout_base(data, rows, drop = drop) : At least one layer must contain all variables used for faceting
Моя ошибка, кажется связанной с обсуждаемой проблеме here, где автор принятого ответа писал:
facet_grid еще более конкретно необходимый имена, а не даже их функции.
Означает ли это, что для меня невозможно передать переменные в кадре данных в опцию огранки внутри функции? Мой фон программирования не является фантастическим, и это было бы настоящим обломком, если бы пользователи моей функции не могли указать переменную огранки. Любая помощь очень ценится!
Не могли бы вы объяснить возникшую проблему? – Soheil
Работал отлично :) ОГРОМНОЕ спасибо! – jsakaluk
@Soheil, 'facet_grid' ожидает формулу, поэтому нам нужно построить формулу программно, если мы хотим, чтобы функция была гибкой. Чтобы передать правильный столбец в формулу, нам нужна строка, потому что «Журнал» не является независимым объектом в среде по умолчанию. Поэтому вместо этого мы передаем его как строку, которая входит в формулу, а ggplot знает, как искать этот столбец в фрейме данных, который был передан функции. Я не уверен, что это самый элегантный способ сделать это, но он работает. – eipi10