Conducting t-test and effect size with reactive input variable

Hello community,

This is hopefully quite a quick fix, but I have been pulling my hair out on this all day.

I am working to put p-values and effect-sizes (Cohen's d) onto ggplot graphs. In Rmd, I calculate the values separately and then add them with annotating to the plots. However, this doesn't seem to be so easy in Shiny.

  • User-uploaded data frame which folks upload from a csv file: df

  • The dataframe includes a continuous numeric variable: var3

  • Users select categorgical variables from a list of relevant dataset variables to include in the graphs: input$var1 and input$var2

What I think isn't working:

  • I have had good success in using get(input$var1) in all my ggplots, but I can't seem to make a similar option for the other functions. The variables live in the dataframe, but not in the environment, I use get() to locate the name of the variable in the dataframe. Is there something else I can use?

  • I would like to identify the ref.group as the first factor. I have tried (head(input$var1),1) and ref.group = [1]. Any other suggestions?

  • I don't feel like calling the two calculated variables as functions is a clean fix: C_d() and df_p_val(). Any other suggestions?

library(ggplot2)
library(rstatix) 
library(ggprism)

options = c("Gender", "Age", "Education", "Income", "MaritalStatus") # these are all variables in the df which will be uploaded by users. 
ui <- fluidPage(
...
    selectInput("var1", "facet1", choices = options),
    selectInput("var2", "facet2", choices = options), 
    plotOutput("plot1"), 

... ) # end UI

server <- function(input, output, session) {
... # other code including csv upload of df and some data cleaning


  df_p_val <- reactive({
        #perform a t-test and obtain the p-value 
         rstatix::t_test(df, var3 ~ get(input$var1) , ref.group = [1]) %>% 
         rstatix::add_xy_position()
                        })

C_d <- reactive({
        #calculate cohen's d effect size
         cohens_d(var3 ~ get(input$var1), data = df)
                        })
# boxplot including p.adj.signif and effsize for var3 ~ var1 
 output$plot1 <- renderPlot( ggplot(df, aes(x = var3, fill = get(input$var1)) ) +  geom_boxplot( ) +
                             facet_grid(get(input$var1) ~ get(input$var2)) +
                              add_pvalue(df_p_val(), label = "p.adj.signif")
                             annotate("text", x = .9, y = 1.1, label = (round(C_d()$effsize, digits = 2)))
...
} # end server