0

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 Answers 2

1

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Hi Phi, thanks for the answer. But I am not quite understanding your meaning about "functions to be available to all sessions....". Can you show me an example? thanks!!
0

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.

2 Comments

could you show me an example how to modify that to read the data from shinyApps.io? thank you so much.
if you can upload the csv file, I assume we could do something like this dash_path <- file.path(paste0(getwd(),"/rawdash.csv")

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.