Maryam Momeni
Maryam Momeni

Reputation: 17

Problem in creating a test file for unit testing of Shiny modules using usethis::use_test()

My R shiny app has two modules. The "dataselect" module and the "plot" module. I want to write unit tests for the two modules using testthat package. I am following the instruction in the mastering Shiny book. It has been mentioned in this book that first, we should create a test file using usethis::use_test() in the R console.

But when I run this code, I get the following error:

Error: Open file must be in the 'R' directory of the active package. Actual path: 'app.R'

It might not be needed, but for more information, I put a minimal example of my Shiny app that I want to write the unit tests for its modules:

library(shiny)
library(plotly)
library(reshape2)

#----------------------------------------------------------------------------------------
# Dataselect module
dataselect_ui<- function(id) {
  ns<-NS(id)
  tagList(
    selectInput(ns("Nametype"),"Select a name type",
                choices=c("Name1","Name2","choose"),selected = "choose"),
    
    selectInput(ns("Name"),"Select a name",
                choices="",selected = "",selectize=TRUE),
    
    DT::DTOutput(ns("tab"))
  )
}
dataselect_server <- function(id) {
  moduleServer(id, function(input, output, session) {
    # Data preparation
    df<-data.frame(Name1<-c("Aix galericulata","Grus grus","    Alces alces"),
                   Name2<-c("Mandarin Duck","Common Crane"  ,"Elk"),
                   eventDate<-c("2015-03-11","2015-03-10","2015-03-10"),
                   individualCount<-c(1, 10, 1)
    )
    colnames(df)<-c("Name1","Name2","eventDate","individualCount")

    # Putting columns Name1 and Nam2 of df in one column called nameType using melt()function
    # This format of data is needed for the choices argument of updateSelectizeInput()
    df2<-reshape2::melt(df,id=c("eventDate","individualCount"))
    colnames(df2)<-c("eventDate","individualCount","nameType","Name")
    
    observeEvent(
      input$Nametype,
      updateSelectizeInput(session, "Name", "Select a name", 
                           choices = unique(df2$Name[df2$nameType==input$Nametype]),selected = ""))
  
    
    # finalDf() is the data used to plot the table and plot
    finalDf<-reactive({
      if(input$Name=="choose"){
        return(NULL)
        
      }
      if(input$Name==""){
        return(NULL)
        
      }
      if(input$Nametype=="choose"){
        return(NULL)
        
      } 
      
      # if the first selectInput is set to Name1, from df select rows their Name1 column are 
      # equal to the second selectInput value
      else if(input$Nametype=="Name1"){
        finalDf<-df[which(df$Name1==input$Name) ,]
        
      } 
      # if the first selectInput is set to Name2, from df select rows their Name2 column are 
      # equal to the second selectInput value
      else if(input$Nametype=="Name2"){
        finalDf<-df[which(df$Name2==input$Name) ,]
        
      }
      return(finalDf)
    })
    
    output$tab<-DT::renderDT({
      req(input$Name)
      datatable(finalDf(), filter = 'top', 
                options = list(pageLength = 5, autoWidth = TRUE),
                rownames= FALSE)
    })
    
    return(
      list("finalDf" = finalDf, "input_Name" = reactive(input$Name))
    )
  })
}

#--------------------------------------------------------------------------------------
# Plot module
plot_ui <- function(id) {
  ns<-NS(id)
  tagList(
    plotlyOutput(ns("plot"))
  )
}

plot_server <- function(id,input_Name ,finalDf) {
  moduleServer(id, function(input, output, session) {
    
    output$plot <- renderPlotly({
      req(input_Name())
      p<-ggplot(finalDf(),aes(x=eventDate,y=individualCount)) +geom_point(alpha=0.2, shape=21, color="black",fill="red",size=5)+
        labs( x = "Date Event",y= "Individual Count") +theme_bw()
      p<-ggplotly(p)
      p
    })
  })
}
#--------------------------------------------------------------------------------------
# application
ui <- fluidPage(
               dataselect_ui("dataselect"),
               plot_ui("plot1")
    )


server <- function(session,input, output) {
  
  dataselect_outputs <- dataselect_server("dataselect")
  plot_server("plot1",input_Name = dataselect_outputs$input_Name
                            ,finalDf= dataselect_outputs$finalDf)

}

shinyApp(ui = ui, server = server)

I appreciate any help everybody can provide.

Upvotes: 0

Views: 149

Answers (0)

Related Questions