0
votes

I am working on shiny and facing some problems in deploying on shinyApps.io. When I running the app in R studio IDE is totally fine but cannot work on shinyApps.io and show:

ERROR: cannot open the connection

I have already published three files (ui, server, data.csv) to shinyApps.io but still cannot work. I think it is because the data cannot be read when I check logs on shinyApps.io, show:

cannot open file 'C:\Users\User\Downloads\Category_dashboard\ads_test\rawdash.csv': No such file or directory

Can someone help out this issue?

ui:

# package
library(shiny)
library(shinydashboard)
library(devtools)
library(xts)
library(dplyr)
library(ggplot2)
library(dplyr)
library(DT)
library(readxl)
# graphic
library(streamgraph)
library(treemap)
library(bubbles)
library(googleVis)
library(dygraphs)
# share to server
library(rsconnect)
library(RJSONIO)

# read data
dash_path <- file.path("C:\\Users\\User\\Downloads\\Category_dashboard\\ads_test\\rawdash.csv")
dash <- read.csv(dash_path,
                 colClasses = c("character","character","character","character","character","character","numeric","numeric"))

# app
ui <- dashboardPage(skin="black", 
                    dashboardHeader(title = "Segment Dashboard", titleWidth = 300),

                    dashboardSidebar(selectInput("c1_input", label = "Segment", 
                                                 choices = c(unique(dash$c1)), multiple = TRUE),
                                     selectInput("c2_input", label = "Sub-segment", 
                                                 choices = c("All", unique(dash$c2)), multiple = TRUE),
                                     selectInput("c3_input", label = "Sub-sub-segment", 
                                                 choices = c("All", unique(dash$c3)), multiple = TRUE),
                                     selectInput("geo_input", label = "Country", 
                                                 choices = c("All", unique(dash$geo)), multiple = TRUE),
                                     selectInput("d1_input", label = "Device", 
                                                 choices = c("All", unique(dash$device)), multiple = TRUE)
                                     #uiOutput("c1_output"),
                                     #uiOutput("c2_output"),
                                     #uiOutput("c3_output"),
                                     #uiOutput("geo_output"),
                                     #uiOutput("d1_output")
                    ),
                    dashboardBody(fluidRow(valueBoxOutput("UserBox"),
                                           valueBoxOutput("SessionBox"),
                                           downloadButton("download_data", "Download")),
                                  br(),
                                  plotOutput("bar", height = 250, width = 925),
                                  br(),
                                  DT::dataTableOutput("table")
                    )
)

server

server <- function(input, output, session){
  # load data
  dash_path <- file.path("C:\\Users\\User\\Downloads\\Category_dashboard\\ads_test\\rawdash.csv")
  dash <- read.csv(dash_path,
                   colClasses = c("character","character","character","character","character","character","numeric","numeric"))  

  # total user
  output$UserBox <- renderValueBox({valueBox(format(sum(dash$nb_user)),
                                             "Total User", icon = icon("area-chart"), color = "green")
  })
  # filtered user
  output$SessionBox <- renderValueBox({valueBox(format(sum((filtered()$nb_user))),
                                                "Segment User", icon = icon("shopping-cart"), color = "green")
  })

  # download output
  output$download_data <- downloadHandler(
    filename <- function(){
      sprintf("download.csv", Sys.Date())
    },
    content <- function(filename){
      dash <- filtered()
      write.csv(dash, file = filename, row.names = FALSE)
    }
  )

  ## UI
  #output$c1_output <- renderUI({
  #selectInput("c1_input", label = "Segment", choices = c("All" = "", unique(dash$c1)), multiple = TRUE)})
  #output$c2_output <- renderUI({
  #selectInput("c2_input", label = "Sub-segment", choices = c("All" = "", unique(filtered()$c2)), multiple = TRUE)})
  #output$c3_output <- renderUI({
  #selectInput("c3_input", label = "Sub-sub-segment", choices = c("All" = "", unique(filtered()$c3)), multiple = TRUE)})
  #output$geo_output <- renderUI({
  #selectInput("geo_input", label = "Country", choices = c("All" = "", unique(filtered()$geo)), multiple = TRUE)})
  #output$d1_output <- renderUI({
  #selectInput("d1_input", label = "Device", choices = c("All" = "", unique(filtered()$device)), multiple = TRUE)})
  #output$d2_output <- renderUI({
  #selectInput("d2_input", label = "Device Type", choices = c("All" = "", unique(filtered()$sub_device)), multiple = TRUE)})

  ## update selection  
  observe({
    c2_input <- if (is.null(input$c1_input)) character(0) else {
      filter(dash, c1 %in% input$c1_input) %>%
        `$`('c2') %>%
        unique() %>%
        sort()
    }
    stillSelected <- isolate(input$c2_input[input$c2_input %in% c2_input])
    updateSelectInput(session, "c2_input", choices = c2_input, selected = stillSelected)
  })

  observe({
    c3_input <- if (is.null(input$c1_input)) character(0) else {
      dash %>%
        filter(c1 %in% input$c1_input,
               c2 %in% input$c2_input) %>%
        `$`('c3') %>%
        unique() %>%
        sort()
    }
    stillSelected <- isolate(input$c3_input[input$c3_input %in% c3_input])
    updateSelectInput(session, "c3_input", choices = c3_input, selected = stillSelected)
  })

  observe({
    geo_input <- if (is.null(input$c1_input)) character(0) else {
      dash %>%
        filter(c1 %in% input$c1_input,
               c2 %in% input$c2_input,
               c3 %in% input$c3_input) %>%
        `$`('geo') %>%
        unique() %>%
        sort()
    }
    stillSelected <- isolate(input$geo_input[input$geo_input %in% geo_input])
    updateSelectInput(session, "geo_input", choices = geo_input, selected = stillSelected)
  })

  observe({
    d1_input <- if (is.null(input$d1_input)) character(0) else {
      dash %>%
        filter(c1 %in% input$c1_input,
               c2 %in% input$c2_input,
               c3 %in% input$c3_input,
               deo %in% input$deo_input) %>%
        `$`('device') %>%
        unique() %>%
        sort()
    }
    stillSelected <- isolate(input$d1_input[input$d1_input %in% d1_input])
    updateSelectInput(session, "d1_input", choices = d1_input, selected = stillSelected)
  })

  ## data for filtered user and download
  filtered <- reactive({
    subset(dash, c1 == input$c1_input)
  })

  ## plot
  output$bar <- renderPlot({
    p <- ggplot(filtered()) +
      geom_bar(aes(x = c1, y = nb_user, fill = c1), position="dodge", stat= "identity") +
      theme(legend.position="top", legend.title=element_blank()) + 
      theme(axis.ticks = element_blank(), axis.title.x = element_blank(), axis.line = element_blank()) +
      theme(axis.text.x= element_text(face= "bold", size= 10), axis.text.y= element_text(face= "bold", size= 10)) +
      theme(strip.background = element_blank(), strip.text = element_blank()) +
      labs(x= "", y= "", title= "")
    print(p)
  })


  ## table
  #output$table <- renderUI({
  output$table <- DT::renderDataTable({
    filtered <- dash %>%
      filter(c1 %in% input$c1_input,
             c2 %in% input$c2_input,
             c3 %in% input$c3_input,
             geo %in% input$geo_input)
    DT::datatable(filtered, escape = FALSE)
  })

  #if (input$c1_input != "All") {
  #  dash <- dash[dash$c1 == input$c1_input,]
  #  }
  #if (input$c2_input != "All") {
  #  dash <- dash[dash$c2 == input$c2_input,]
  #  }
  #if (input$c3_input != "All") {
  #  dash <- dash[dash$c3 == input$c3_input,]
  #  }
  #dash
  #})
}
2

2 Answers

1
votes

The app isn't working because your filepath is set to a path that doesn't exist on the shinyapps.io server. Create a sub-directory off the working directory for the location of the files you're including. If you're unsure of what the working directory is use getwd() to get it. Put your files in that directory. For this example we'll us the name 'directoryname' but use any name you'd like. Change the path line to : dash_path <- file.path("directoryname\rawdash.csv") Also though it may work, creating your functions inside of a shiny output is generally bad practice for both efficiency and availability reasons. For example, if you want functions to be available to all sessions they need to be run from outside of the shiny server() call.

0
votes

The problem is the fact that you are referencing a file location, as it is on your local computer. This file path does not exist on the server. The solution is to work with relative paths in the file location.