Search code examples
rggplot2ggpubrr-glue

The glue function needs to refer to the data frame by a dollar sign in geom_brackets


I have a code like this

#creating a categorical variable from a continuous one.
lobxx <- Loblolly %>% 
           mutate(ageG = if_else(age < 10,"A", if_else(age == 10, "B", if_else(age > 10, "C", "NA"))))
#calculating the t value
dfxx <- lobxx %>%
          rstatix::df_arrange(ageG,age) %>%
          rstatix::t_test(height~ageG) %>%
          rstatix::add_xy_position(x="ageG")
#creating a plot using ggplot and ggpubr::geom_bracket
dfxplotx <- ggplot(lobxx,aes(x= reorder(ageG,-height),y=height,fill=ageG))+
        stat_summary(geom="col",fun = mean)+
        ggpubr::geom_bracket(mapping=aes(xmin = group1, xmax = group2),data = dfxx,
                label = glue("P:{dfxx$p.adj}{dfxx$p.adj.signif}"),
                        y.position = c(53,60,53),
                        bracket.nudge.y = 5,inherit.aes = F)

dfxplotx

You can notice that I used the dollar sign to refer to the data frame. The point is that I noticed that most examples on the web did not use a format like this (data frame $ variable). Is there something wrong with the code or has something changed elsewhere? thank you.

I tried this code without using the $ sing in the glue function but I had error message. Why should this happen.


Solution

  • an alternative to $ syntax for pulling things out of lists is square brackets. When they both work there is no benefit to using one or the other apart from style/habit. However square bracket syntax is more general / powerful, as it can be used directly for metaprogramming; i.e. writing code which relies on the contents of variables to do one thing or another. Here is an example

    myl <- list(x=1,y="a")
    
    # direct access is just as good for one as another
    # lets say we want the x contents from myl which is `1`
    myl$x
    myl["x"]
    # but the square bracket took me 3 more keypresses to write
    
    #if we want to write code with an additional level of `indirection`
    # i.e. we didnt write code to get either x or y from myl
    # we write code to get whatever of x or y another variable `get_me_` says to get 
    get_me_<- "y"
    
    # we can do this with square brackets
    myl[get_me_]
    # $y
    # [1] "a"
    
    # this is simply not a thing with $ syntax ; you would need to get into 
    # parseing and evaluating string commands to force such an approach to work
    myl$get_me_
    # hence why square brackets are more 'powerful'