2017-05-15 2 views
2

J'ai été confronté à un problème avec geom_hline ou geom_vline si je l'appelle sous la fonction personnalisée et prend la valeur d'un vecteur. Il semble fonctionner très bien jusqu'à ce que j'ajouter facet_grid() dans cette fonction body.eg Sans fonctiongeom_hline ou geom_vline ne semble pas accepter de vecteur pour la ligne de référence, si elle est appelée dans une fonction et facet_grid() est utilisé

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) 

`

Je reçois ceci: enter image description here

Mais avec fonction

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") 

Avec la fonction I a m obtenir cette erreur:

Error in $<-.data.frame (*tmp* , "PANEL", value = c(1L, 2L, 3L, 1L, : replacement has 15 rows, data has 4 I hope someone can help me in figuring out, how to do it through function, without an error. Thanks

+0

ne pas affecter un objet portant le nom 'c'. 'c' est une fonction de base essentielle que vous utilisez dans votre propre code. – Matt74

Répondre

2

Le problème est avec votre définition des facettes. Vous devez créer un appel de formule approprié avec le nom de variable correct, n'utilisez pas les données directement. En utilisant paste et as.formula peut aider ici.

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) 
}