[R] R Shiny Help - Trouble passing user input columns to emmeans after ANOVA analysis

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Thu Jun 6 16:49:19 CEST 2024


Wrong list. Shiny is software from an external provider, POSIT (formerly
RStudio) and not part of R, itself. They have a community support site at:

https://forum.posit.co/?_gl=1*bh848i*_ga*MTY2NjcwNzQ4LjE3MTYyMzkzODQ.*_ga_2C0WZ1JHG0*MTcxNzY4NTExNi4yLjAuMTcxNzY4NTExNi4wLjAuMA
..

Cheers,
Bert

On Thu, Jun 6, 2024 at 12:09 AM I B <ibarnhart055 using gmail.com> wrote:

> Hello everybody,
>
> I have experience coding with R, but am brand new to R Shiny. I am trying
> to produce an application that will allow users to upload their own
> dataset, select columns they want an ANOVA analysis run on, and generate
> graphs that will allow users to view their results. However, I am getting
> the following error: *"Argument is of length zero."*
>
> Being new to Shiny, I am having trouble passing the user input column to an
> emmeans argument in order to do a post hoc analysis, and using that
> information to produce a graph. Can somebody help me with this? *The code
> for my dataset and application are provided below; copying and pasting
> directly into R should generate the reproducible example.*
>
> In my application, the following columns should be selected after uploading
> the dataset:
>
>    - Select response variable: "ndvi"
>    - Select first independent variable: "genotype"
>    - Select second independent variable: "rate"
>    - Select random variable: "rep"
>
> For this example, the final two drop-down selections should be:
>
>    - "Which variable would you like to graph? "genotype"
>    - "Which ANOVA model do you want to graph? "Main effects model"
>
> Any help would be great. Thank you so much!
>
> Sincerely,
> Isaac Barnhart, PhD
>
>
> *Here is my dataset:*
>
> data <- data.frame(rep =
> c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3),
>                    genotype =
>
> c('a','a','a','a','b','b','b','b','c','c','c','c','a','a','a','a','b','b','b','b','c','c','c','c','a','a','a','a','b','b','b','b','c','c','c','c'),
>                    rate =
>
> c('1x','2x','4x','8x','1x','2x','4x','8x','1x','2x','4x','8x','1x','2x','4x','8x','1x','2x','4x','8x','1x','2x','4x','8x','1x','2x','4x','8x','1x','2x','4x','8x','1x','2x','4x','8x'),
>                    ndvi =
>
> c(0.584947811,0.642112121,0.654116902,0.785068313,0.79665163,0.674549249,0.958911611,0.547077528,0.613315552,0.768646411,0.97107949,0.680942649,0.520576242,0.723920266,0.868779972,0.834257732,0.554506685,0.520458208,0.617282262,0.80128067,0.875192693,0.572153151,0.850305042,0.500760522,0.796305833,0.643719779,0.590512435,0.522884966,0.905197544,0.663792758,0.690415735,0.975449466,0.621379163,0.734904647,0.812023395,0.928144532))
>
>
> *Here is my code:*
>
> library(shiny)
> library(ggplot2)
> library(tidyverse)
> library(emmeans)
> library(DHARMa)
> library(lme4)
>
> ui <- fluidPage(
>   fileInput("file1", "Choose .csv or .xlsx file",
>             accept = c("text/csv",
>                        "text/comma-separated-values",
>                        ".csv",
>                        ".xlsx")),
>   textOutput("data_info"),
>   verbatimTextOutput("data_head"),
>   uiOutput("column_selector_1"),
>   uiOutput("column_selector_2"),
>   uiOutput("column_selector_3"),
>   uiOutput("column_selector_4"),
>   textOutput("dist_info"),
>   plotOutput("dist"),
>   textOutput("str_info"),
>   verbatimTextOutput("selected_columns"),
>   textOutput("two_way_anova"),
>   verbatimTextOutput("model_summary"),
>   textOutput("main_effects"),
>   verbatimTextOutput("model_summary_ME"),
>   textOutput("mod_diagnostic"),
>   plotOutput("diagnostic_plot"),
>   uiOutput("graph"),
>   uiOutput("model_selection"),
>   plotOutput("graph_plot")
> )
>
> server <- function(input, output, session) {
>   # Open file
>   req(data <- reactive({
>     infile <- input$file1
>     if (is.null(infile)) {
>       return(NULL)
>     }
>     read.csv(infile$datapath, header = TRUE)
>   }))
>
>   # Preview data
>   output$data_info <- renderText({
>     req(data())
>     "Preview of the data uploaded:"
>   })
>
>   output$data_head <- renderPrint({
>     req(data())
>     head(data(), 20)
>   })
>
>   # Select response variable
>   output$column_selector_1 <- renderUI({
>     req(data())
>     selectInput("column1","Select response variable", choices =
> names(data()))
>     })
>
>   # Select first independent variable
>   output$column_selector_2 <- renderUI({
>     req(data())
>     selectInput("column2", "Select first independent variable", choices =
> names(data()))
>   })
>
>   # Select second independent variable
>   output$column_selector_3 <- renderUI({
>     req(data())
>     selectInput("column3", "Select second independent variable", choices =
> names(data()))
>   })
>
>   # Select random variable
>   output$column_selector_4 <- renderUI({
>     req(data())
>     selectInput("column4", "Select random variable", choices =
> names(data()))
>   })
>
>   # Assigning user inputs to correct variables
>   selected_columns <- reactive({
>     req(data(), input$column1, input$column2, input$column3, input$column4)
>     list(
>       dependent = data()[[input$column1]],
>       independent1 = as.factor(data()[[input$column2]]),
>       independent2 = as.factor(data()[[input$column3]]),
>       random = as.factor(data()[[input$column4]]),
>
>       # Define column names for later use
>       column1 <- input$column1,
>       column2 <- input$column2,
>       column3 <- input$column3,
>       column4 <- input$column4
>     )
>   })
>
>   # Instructional text
>   output$dist_info <- renderText({
>     req(data())
>     "The graph below shows the shape of response variable distribution"
>   })
>
>
>   # Distribution plot
>   output$dist <- renderPlot({
>     req(selected_columns())
>     cols <- selected_columns()
>     plot(density(cols$dependent), main = "Distribution Plot")
>   })
>
>   # Instructional text
>   output$str_info <- renderText({
>     req(data())
>     "The code below verifies that our data are in the correct structure for
> ANOVA analyses. All independent variables should be changed to 'Factor'. "
>   })
>
>   # Verifies that columns are in the correct structure
>   output$selected_columns <- renderPrint({
>     cols <- selected_columns()
>     str(cols)
>   })
>
>   # Instructional text
>   output$two_way_anova <- renderText({
>     req(data())
>     "Two-way ANOVA with interaction"
>   })
>
>   # Build ANOVA model with two-way interaction
>   interaction_model <- reactive({
>     cols <- selected_columns()
>     req(cols)
>     data <- data()
>     data$dep <- cols$dependent
>     data$indep1 <- cols$independent1
>     data$indep2 <- cols$independent2
>     data$rand <- cols$random
>     lmer(dep ~ indep1 * indep2 + (1|rand), data = data)
>   })
>
>   # Run two-way ANOVA model with interaction
>   output$model_summary <- renderPrint({
>     req(interaction_model())
>     Anova(interaction_model(), type = c("III"))
>   })
>
>   # Build main effects ANOVA model
>   main_effects_model <- reactive({
>     cols <- selected_columns()
>     req(cols)
>     data <- data()
>     data$dep <- cols$dependent
>     data$indep1 <- cols$independent1
>     data$indep2 <- cols$independent2
>     data$rand <- cols$random
>     lmer(dep ~ indep1 + indep2 + (1|rand), data = data)
>   })
>
>   # Instructional text
>   output$main_effects <- renderText({
>     req(data())
>     "Two-way ANOVA, main effects"
>   })
>
>   # Run two-way main effects model
>   output$model_summary_ME <- renderPrint({
>     req(main_effects_model())
>     Anova(main_effects_model(), type = c("III"))
>   })
>
>
>   output$mod_diagnostic <- renderText({
>     req(main_effects_model())
>     "Below, the `DHARMa` package is used to check model assumptions. If
> assumptions are not met, then data transformations may be needed before
> proceeding."
>   })
>
>   output$diagnostic_plot <- renderPlot({
>     req(interaction_model())
>     plotQQunif(interaction_model())
>   })
>
>   output$graph <- renderUI({
>     req(data(), input$column2, input$column3)
>     selectInput("graph", "Which variable would you like to graph?", choices
> = c(input$column2, input$column3, "interaction"))
>   })
>
>   output$model_selection <- renderUI({
>     req(main_effects_model(), interaction_model())
>     selectInput("model_selection", "Which ANOVA model do you want to
> graph?", choices = c("Main effects model", "Interaction model"))
>   })
>
>   # Create a reactive expression to store the selected graph variable
>   selected_graph <- reactive({
>     input$graph
>   })
>
>   # Create a reactive expression to store the selected model
>   selected_model <- reactive({
>     input$model_selection
>   })
>
>   # Render the plot based on the selected variables
>   output$graph_plot <- renderPlot({
>     req(data(), selected_graph(), selected_model())
>     cols <- selected_columns()
>
>     if (selected_graph() == cols$column2 | selected_model() == "Main
> effects model") {
>
>       # Mean separation: First column
>       mod_means_cotr1 <- emmeans(main_effects_model(), pairwise ~
> cols$column2,
>                                 adjust = 'tukey',
>                                 type = 'response')
>
>       mod_means1 <- multcomp::cld(object = mod_means_cotr1$emmeans,
>                                  LETTERS = "letters")
>
>       # Graph: First column
>       ggplot(mod_means1, aes_string(x = cols$column2, y = cols_column1))+
>         geom_bar(stat="identity", width = 0.6, position = "dodge", col =
> "black", fill = "purple3")+
>         geom_errorbar(aes(ymin = emmean, ymax = emmean + SE), width = 0.3,
> position = position_dodge(0.6))+
>         xlab(cols$column2)+
>         ylab(cols$column1)+
>         theme(plot.title=element_text(hjust=0.5, size = 20),
>               plot.subtitle = element_text(hjust = 0.5, size = 15),
>               axis.text = element_text(size = 17),
>               axis.title = element_text(size = 20))+
>         geom_text(aes(label=.group, y=emmean + SE), vjust = -0.9, size = 8)
> +
>         #ylim(0, 105)+
>         scale_x_discrete(labels = function(x) str_wrap(x, width = 7))
>
>
>     }
>   })
>
> }
> shinyApp(ui, server)
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list