1

Friends, could you help me with the following problem: The executable code is working correctly. I am using the database via fileInput. It's working. I insert the functionality of when I inserted the database the conditionalPanel appears. So far it's ok. My problem is that when I press the reset button and insert the database again, conditionalPanel no longer appears. I think there must be something on the server reset button. Can you help me?

library(shiny)
library(ggplot2)
library(rdist)
library(geosphere)
library(kableExtra)
library(readxl)
library(tidyverse)
library(DT)
library(shinythemes)

#database
df<-structure(list(Properties = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35), Latitude = c(-23.8, -23.8, -23.9, -23.9, -23.9,  -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, 
                                                                                                                                                 + -23.9, -23.9, -23.9, -23.9, -23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9), Longitude = c(-49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.7, 
                                                                                                                                                                                                                                                                                                     + -49.7, -49.7, -49.7, -49.7, -49.6, -49.6, -49.6, -49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6), Waste = c(526, 350, 526, 469, 285, 175, 175, 350, 350, 175, 350, 175, 175, 364, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                          + 175, 175, 350, 45.5, 54.6,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350)), class = "data.frame", row.names = c(NA, -35L))

function.cl<-function(df,k,Filter1,Filter2){

  if (Filter1==2){
    Q1<-matrix(quantile(df$Waste, probs = 0.25)) 
    Q3<-matrix(quantile(df$Waste, probs = 0.75))
    L<-Q1-1.5*(Q3-Q1)
    S<-Q3+1.5*(Q3-Q1)
    df_1<-subset(df,Waste>L[1]) 
    df<-subset(df_1,Waste<S[1])
  }

  #cluster
  coordinates<-df[c("Latitude","Longitude")]
  d<-as.dist(distm(coordinates[,2:1]))
  fit.average<-hclust(d,method="average") 


  #Number of clusters
  clusters<-cutree(fit.average, k) 
  nclusters<-matrix(table(clusters))  
  df$cluster <- clusters 

  #Localization
  center_mass<-matrix(nrow=k,ncol=2)
  for(i in 1:k){
    center_mass[i,]<-c(weighted.mean(subset(df,cluster==i)$Latitude,subset(df,cluster==i)$Waste),
                       weighted.mean(subset(df,cluster==i)$Longitude,subset(df,cluster==i)$Waste))}
  coordinates$cluster<-clusters 
  center_mass<-cbind(center_mass,matrix(c(1:k),ncol=1)) 

  #Coverage
  coverage<-matrix(nrow=k,ncol=1)
  for(i in 1:k){
    aux_dist<-distm(rbind(subset(coordinates,cluster==i),center_mass[i,])[,2:1])
    coverage[i,]<-max(aux_dist[nclusters[i,1]+1,])}
  coverage<-cbind(coverage,matrix(c(1:k),ncol=1))
  colnames(coverage)<-c("Coverage_meters","cluster")

  #Sum of Waste from clusters
  sum_waste<-matrix(nrow=k,ncol=1)
  for(i in 1:k){
    sum_waste[i,]<-sum(subset(df,cluster==i)["Waste"])
  }
  sum_waste<-cbind(sum_waste,matrix(c(1:k),ncol=1))
  colnames(sum_waste)<-c("Potential_Waste_m3","cluster")

  #Output table
  data_table <- Reduce(merge, list(df, coverage, sum_waste))
  data_table <- data_table[order(data_table$cluster, as.numeric(data_table$Properties)),]
  data_table_1 <- aggregate(. ~ cluster + Coverage_meters + Potential_Waste_m3, data_table[,c(1,7,6,2)], toString)

  #Scatter Plot
  suppressPackageStartupMessages(library(ggplot2))
  df1<-as.data.frame(center_mass)
  colnames(df1) <-c("Latitude", "Longitude", "cluster")
  g<-ggplot(data=df,  aes(x=Longitude, y=Latitude,  color=factor(clusters))) + geom_point(aes(x=Longitude, y=Latitude), size = 4)
  Centro_View<- g +  geom_text(data=df, mapping=aes(x=eval(Longitude), y=eval(Latitude), label=Waste), size=3, hjust=-0.1)+ geom_point(data=df1, mapping=aes(Longitude, Latitude), color= "green", size=4) + geom_text(data=df1, mapping = aes(x=Longitude, y=Latitude, label = 1:k), color = "black", size = 4)
  plotGD<-print(Centro_View + ggtitle("Scatter Plot") + theme(plot.title = element_text(hjust = 0.5)))

  return(list(
    "Data" = data_table_1,
    "Plot" = plotGD
  ))
}

ui <- bootstrapPage(
  navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
             "Cl", 

             tabPanel("Solution",
                      fileInput("data", h3("Import excel")), 
                      sidebarLayout(
                        sidebarPanel(
                          radioButtons("filtro1", h3("Select properties"),
                                       choices = list("All properties" = 1, 
                                                      "Exclude properties" = 2),
                                       selected = 1),

                          tags$b(h5("(a) Choose other filters")),
                          tags$b(h5("(b) Choose clusters")),  
                          sliderInput("Slider", h5(""),
                                      min = 2, max = 8, value = 5),

                          conditionalPanel(
                            "output.fileUploaded == true",
                            tags$p(h3("Are you satisfied?")),
                          tags$b(h5("(a) Choose others filters")),
                          tags$b(h5("(b) Choose number of clusters"))),  
                          actionButton("reset", "Reset"),
                        ),

                        mainPanel(
                          tabsetPanel(      
                            tabPanel("Solution", plotOutput("ScatterPlot"))))

                      ))))


server <- function(input, output, session) {

  v <- reactiveValues(df = NULL)
  observeEvent(input$data, {
    v$df <- read_excel(input$data$datapath)
  })


  Modelcl<-reactive({if (!is.null(v$df)) {
    function.cl(v$df,input$Slider,1,1)
  }
  })


  observeEvent(input$reset, {
    v$df <- NULL
    updateRadioButtons(session,"Slider", selected = 5)
    output$fileUploaded <-NULL
  })

  output$fileUploaded <- reactive({
    !is.null(input$data)
  })
  outputOptions(output, 'fileUploaded', suspendWhenHidden=FALSE)

  Modelcl<-reactive({if (!is.null(v$df)) {
    function.cl(v$df,input$Slider,1,1)
  }
  })


  output$ScatterPlot <- renderPlot({
    Modelcl()[[2]]
  })

  observeEvent(input$Slider,{
    updateSelectInput(session,'select',
                      choices=unique(df[df==input$Slider]))
  }) 

}

shinyApp(ui = ui, server = server)

Thank you very much!

Antonio
  • 1,091
  • 7
  • 24

2 Answers2

1

This is not ideal, but something you can try. This is a smaller (reproducible) example to test. Your question might get more attention if it is reduced to what is needed to reproduce the problem.

You can add another reactiveValues flag (in this case called clear) that tracks whether data has been loaded or not, and use that.

I looked around for good solutions on resetting fileInput but found mostly work arounds. In this case, when you hit reset, the fileInput still looks the same, which is not desirable.

However, when you hit reset the conditionalPanel should be response through output$fileUploaded.

library(shiny)
library(shinythemes)
library(readxl)

df<-structure(list(Properties = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35), 
                   Latitude = c(-23.8, -23.8, -23.9, -23.9, -23.9,  -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9,-23.9), 
                   Longitude = c(-49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.7, -49.7, -49.7, -49.7, -49.7, -49.6, -49.6, -49.6, -49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6,-49.6), 
                   Waste = c(526, 350, 526, 469, 285, 175, 175, 350, 350, 175, 350, 175, 175, 364, 175, 175, 350, 45.5, 54.6,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350)), 
              class = "data.frame", row.names = c(NA, -35L))

ui <- bootstrapPage(
  navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
             "Cl", 
             tabPanel("Solution",
                      fileInput("data", h3("Import excel")), 
                      sidebarLayout(
                        sidebarPanel(
                          radioButtons("filtro1", h3("Select properties"),
                                       choices = list("All properties" = 1, 
                                                      "Exclude properties" = 2),
                                       selected = 1),

                          tags$b(h5("(a) Choose other filters")),
                          tags$b(h5("(b) Choose clusters")),  
                          sliderInput("Slider", h5(""),
                                      min = 2, max = 8, value = 5),
                          conditionalPanel(
                            "output.fileUploaded == true",
                            tags$p(h3("Are you satisfied?")),
                            tags$b(h5("(a) Choose others filters")),
                            tags$b(h5("(b) Choose number of clusters"))),  
                          actionButton("reset", "Reset"),
                        ),
                        mainPanel(
                          tabsetPanel(      
                            tabPanel("Solution", plotOutput("ScatterPlot"))))
                      ))))

server <- function(input, output, session) {

  v <- reactiveValues(df = NULL, clear = FALSE)

  observeEvent(input$reset, {
    v$df <- NULL
    v$clear <- FALSE
    updateRadioButtons(session, "Slider", selected = 5)
  })

  observeEvent(input$data, {
    v$df <- read_excel(input$data$datapath)
    v$clear <- TRUE
  })

  output$fileUploaded <- reactive({
    v$clear
  })

  outputOptions(output, "fileUploaded", suspendWhenHidden = FALSE)

  observe({
    updateSelectInput(session, 'select', choices=unique(df[df==input$Slider]))
  })

}

shinyApp(ui = ui, server = server)
Ben
  • 28,684
  • 5
  • 23
  • 45
  • It worked Ben, I don't even know how to thank =). I was looking at several sources, but I didn't find anything related to my problem, because it was working, it only gave an error when I pressed reset and I tried to load the file again. But now it worked, thank you very much! – Antonio May 15 '20 at 21:11
  • Hi Ben, hope you're alright! Could you please take a look at this question: https://stackoverflow.com/questions/69490301/adjust-shiny-code-to-generate-correct-graph-depending-on-the-date-code-you-choos – Antonio Oct 08 '21 at 14:41
0

When the reset button is pressed, you set output$fileUploaded <-NULL, and the condition to show the panel conditionalPanel("output.fileUploaded == true", is not met anymore.

You can possibly change the condition to conditionalPanel("output.fileUploaded == true | output.fileUploaded == NULL",

tic-toc-choc
  • 815
  • 11
  • 26
  • Thanks for the answer. I did it the way you told me by changing the condition to `` `conditionalPanel (" output.fileUploaded == true | output.fileUploaded == NULL ",` `However, now it is showing all the text regarding the condition. is it necessary to change something on the server too? – Antonio May 14 '20 at 20:57
  • maybe keep the code as it was but remove `output$fileUploaded <-NULL`? – tic-toc-choc May 14 '20 at 21:16
  • So friend from what I noticed when I left the condition as you commented: `` `conditionalPanel (" output.fileUploaded == true | output.fileUploaded == NULL "` `'' in the UI, it always shows the descriptive text when starting shiny. – Antonio May 14 '20 at 21:52
  • That way ```conditionalPanel (" output.fileUploaded == true``` that I had done it does not appear when starting shiny. – Antonio May 14 '20 at 21:54
  • am I missing something? – Antonio May 15 '20 at 13:48