Pregunta

I have following dataframe and function:

structure(list(vnum1 = c(-0.853002701467605, -2.41044831451325, 
                          1.22391941685926, 0.539011835935724, 
                         -1.33616761309235, -1.33762097068431, 
                          0.0391687995434752, -0.0396899713936502, 
                          -1.34004495967791, 0.731212395958092), 

                vnum2 = c(-0.0140296461607895, 0.649714762844125, 
                          -0.202655014660386, 1.90785563726907, 
                           0.240191747220876, 0.0395243104031934, 
                           -2.1689146110194, -0.198126356757339, 
                           1.89172814288286, -0.484592561521101), 
             vint1 = c(7L, 4L, 7L, 3L, 10L, 10L, 7L, 8L, 2L, 3L), 
             vint2 = c(2L, 8L, 2L, 7L, 3L, 3L, 2L, 8L, 4L, 6L), 
             vfac1 = structure(c(3L, 1L, 2L, 4L, 1L, 1L, 2L, 2L, 1L, 2L),
            .Label = c("1", "2", "3", "4"), class = "factor"), 
             vfac2 = structure(c(3L, 4L, 4L, 2L, 4L, 1L, 1L, 2L, 1L, 4L), 
            .Label = c("1", "2", "3", "4"), class = "factor"), 
             vch1 = structure(c(5L,  1L, 2L, 2L, 3L, 3L, 4L, 4L, 2L, 5L), 
            .Label = c("A", "B", "C", "D", "E"), class = "factor"), 
             vbin1 = structure(c(1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L), 
            .Label = c("a", "b"), class = "factor")), 
            .Names = c("vnum1", "vnum2", "vint1", "vint2", "vfac1", "vfac2", "vch1", "vbin1"), 
            row.names = c(NA, -10L), class = "data.frame")
> 

grfour1 <- function(gdf, first, second, third, fourth){
    ggplot(gdf, aes(first, second)) + 
        geom_point(position = position_jitter(width = 0.2, height = 0)) + 
        facet_grid(third~fourth) 
}

On running the command, I get this error:

> grfour1(rndf, vint1, vint2,vch1,vint2)
Error in eval(expr, envir, enclos) : object 'second' not found
> 

Where is the error? Thanks for helping.

¿Fue útil?

Solución

There are several issues here. First, ggplot parses column names into the aes without the quotes, thus when you do aes(first, second), ggplot2 actually looks for columns named "first" and "second" rather the variables that contains the names you parsed. Second problem is that R doesn't know whats vints, he thinks it's some object in the global enviroment, thus, you need to tell it that this is a character using "vint1"

My solution will be

grfour1 <- function(gdf, first, second, third, fourth){
    gdf <- gdf[c(first, second, third, fourth)]
    names(gdf) <- c("first", "second", "third", "fourth") 
    ggplot(gdf, aes(first, second)) + 
      geom_point(position = position_jitter(width = 0.2, height = 0)) + 
      facet_grid(third ~ fourth) 
  }
library(ggplot2)
grfour1(rndf, "vint1", "vint2", "vch1", "vint2")

Otros consejos

Your column names are only visible to the ggplot function because it uses the data as its environment. They are not visible to R in your global environment. To fix the problem your function definition should be:

grfour1 <- function(gdf, first, second, third, fourth){
    ggplot(gdf, aes_string(first, second)) + 
      geom_point(position = position_jitter(width = 0.2, height = 0)) + 
      facet_grid(paste(third, "~", fourth)) 
}

In this case first to fourth should be character variables:

grfour1(rndf, "vint1", "vint2", "vch1", "vint2")
grfour1 <- function(gdf, first, second, third, fourth){
  ggplot(gdf, aes_string(deparse(substitute(first)), deparse(substitute(second)))) + 
    geom_point(position = position_jitter(width = 0.2, height = 0)) +
    facet_grid(deparse(substitute(third~fourth))) 
}

should work with grfour1(rndf, vint1, vint2,vch1,vint2), if you called e.g. attach(rndf) before. Explanation see @ilir & @DavidArenburg.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top