2015-09-13 4 views
4

Итак, я пытаюсь разработать функцию построения графика на основе для существующего пакета 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 себя (подставляя в соответствующие векторы из кадр данных), все работает нормально: enter image description here

Но если попытаться запустить функцию, функция построения самой ...:

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 еще более конкретно необходимый имена, а не даже их функции.

Означает ли это, что для меня невозможно передать переменные в кадре данных в опцию огранки внутри функции? Мой фон программирования не является фантастическим, и это было бы настоящим обломком, если бы пользователи моей функции не могли указать переменную огранки. Любая помощь очень ценится!

ответ

3

Два изменения из исходного кода: передать заявление facetting в facet_grid с помощью paste построить соответствующую строку (на @ aosmith замечания, формула обертка не нужна), а затем передать переменные фасеты функции в виде строки.

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(paste(group, "~ .")) 
} 

plot1(dat, 0.5, "Journal") 
+0

Не могли бы вы объяснить возникшую проблему? – Soheil

+0

Работал отлично :) ОГРОМНОЕ спасибо! – jsakaluk

+2

@Soheil, 'facet_grid' ожидает формулу, поэтому нам нужно построить формулу программно, если мы хотим, чтобы функция была гибкой. Чтобы передать правильный столбец в формулу, нам нужна строка, потому что «Журнал» не является независимым объектом в среде по умолчанию. Поэтому вместо этого мы передаем его как строку, которая входит в формулу, а ggplot знает, как искать этот столбец в фрейме данных, который был передан функции. Я не уверен, что это самый элегантный способ сделать это, но он работает. – eipi10

Смежные вопросы