geom_hline или geom_vline, кажется, не принимает вектор для опорной линии, при вызове внутри функции и facet_grid() используется
Я столкнулся с проблемой с geom_hline или geom_vline, если я вызываю его в пользовательской функции, и она берет значение из вектора. Кажется, что работает нормально, пока я не добавлю facet_grid() в эту функцию body.egБез функции
c<- data.frame(A = c("carr","bike","truck","carr","truck","bike","bike","carr","truck","carr","truck","truck","carr","truck","truck"),
B = c(10,20,30,23,45,56,78,44,10,20,30,10,20,30,67),
D = c(1,2,3,1,2,3,2,3,2,3,2,2,3,2,1))
a = c(1:4)*4
ggplot(c, aes(A,B, color = D))+
geom_point()+
facet_grid( .~D)+
geom_hline(yintercept = a,linetype = "dotted",size =0.3)
`
Но с функцией
tk_fun <- function(dat,x1,y1,clr){ # I need to have this a declared and defined with in function.
a = c(1:4)*4.5 p <- ggplot(dat, aes_string(colnames(dat)[1],colnames(dat)[2], color = colnames(dat)[3]))+
geom_point()+ facet_grid( .~dat[,3])+
geom_hline(yintercept = a,linetype = "dotted",size =0.3) return(p) } tk_fun(c,"A","B","D")
С помощью функции я получаю эту ошибку:
Ошибка в
$<-.data.frame
(*tmp*
, "PANEL", value = c (1L, 2L, 3L, 1L,: замена имеет 15 строк, данные имеет 4 Я надеюсь, что кто-то может помочь мне выяснить, как это сделать с помощью функции, без ошибок. Спасибо
1 ответ
Решение
Проблема в вашем определении граней. Вам нужно создать соответствующий вызов формулы с правильным именем переменной, а не использовать данные напрямую. С помощью paste
а также as.formula
может помочь здесь
tk_fun <- function(dat,x1,y1,clr){ # I need to have this a declared and defined with in function.
a = c(1:4)*4.5
p <- ggplot(dat, aes_string(colnames(dat)[1],colnames(dat)[2], color = colnames(dat)[3]))+
geom_point() +
facet_grid(as.formula(paste('. ~', names(dat)[3]))) +
geom_hline(yintercept = a, linetype = "dotted", size =0.3)
return(p)
}