How to separate shiny app to two files: UI and SERVER

Viewed 54

I've this app:

library(shiny)

ui = function(req) {
  fluidPage(
    textInput("caption", "Caption", "Data Summary"),
    verbatimTextOutput("value")
  )
}

server = function(input, output, session) {
  observe({
    # Trigger this observer every time an input changes
    reactiveValuesToList(input)
    session$doBookmark()
  })
  onBookmarked(function(url) {
    updateQueryString(url)
  })
  output$value <- renderText({ input$caption })
}

shinyApp(ui, server, enableBookmarking = "url")

I want to separate it to two files: ui.r and server.r I tried to do it:

ui.r

library(shiny)
function(req) {
  fluidPage(
    textInput("caption", "Caption", "Data Summary"),
    verbatimTextOutput("value")
  )
}

server.r

 function(input, output, session) {
  observe({
    # Trigger this observer every time an input changes
    reactiveValuesToList(input)
    session$doBookmark()
  })
  onBookmarked(function(url) {
    updateQueryString(url)
  })
  output$value <- renderText({ input$caption })
}


but it is not running well. I guess it because the missing row: shinyApp(ui, server, enableBookmarking = "url")

any help will be wellcome

1 Answers

We can put enableBookmarking("url") in global.R to make (live) bookmarking work in a multi file app:

global.R

library(shiny)
enableBookmarking("url")

ui.R

ui = function(req) {
  fluidPage(
    textInput("caption", "Caption", "Data Summary"),
    verbatimTextOutput("value")
  )
}

server.R

server = function(input, output, session) {
  observe({
    # Trigger this observer every time an input changes
    reactiveValuesToList(input)
    session$doBookmark()
  })
  onBookmarked(function(url) {
    updateQueryString(url)
  })
  output$value <- renderText({ input$caption })
}
Related