dreamRs / datamods

Shiny modules to import and manipulate data into an application or addin
https://dreamrs.github.io/datamods/
GNU General Public License v3.0
138 stars 35 forks source link

Combining with Esquisse. #22

Closed MatthijsBlom closed 3 years ago

MatthijsBlom commented 3 years ago

I wish to combine datamods with Esquisse, ala

library(datamods)
library(esquisse)

ui <- fluidPage(
  import_file_ui(id = "import_file"),
  esquisserUI(id = "esquisse")
)

server <- function(input, output, session) {
  imported <- import_file_server(id = "import_file")

  data <-  # ...imported...

  callModule(
    module = esquisserServer,
    id = "esquisse",
    data = data
  )
}

shinyApp(ui, server)

It would appear imported has the wrong structure to serve as data for esquisserServer. Even after extensive trial and error, I haven't found success. Could you perhaps shed some light on this?

pvictor commented 3 years ago

Hello,

If you install dev version of esquisse from GitHub, datamods is already integrated. And esquisserUI / esquisserServer are deprecated in favor of esquisse_ui / esquisse_server.

To solve your problem you have to use an intermediate observe to populate a reactiveValue that you can pass to esquisse module.

With current CRAN version of esquisse, you can do:

library(shiny)
library(datamods)
library(esquisse)

ui <- navbarPage(
  title = "My navbar app",
  id = "nav",
  tabPanel(
    title = "Import",
    fluidRow(
      column(
        width = 6, offset = 3,
        import_file_ui(id = "import_file")
      )
    )
  ),
  tabPanel(
    title = "esquisse",
    esquisserUI(
      id = "esquisse", 
      header = FALSE,
      container = esquisseContainer(
        fixed = c(55, 0, 0, 0)
      )
    )
  )
)

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

  imported <- import_file_server(id = "import_file")

  rv <- reactiveValues(data = data.frame(), name = "data")
  observeEvent(imported$data(), {
    updateNavbarPage(session, "nav", selected = "esquisse")
    rv$data <- imported$data()
  })

  callModule(
    module = esquisserServer,
    id = "esquisse",
    data = rv
  )
}

shinyApp(ui, server)

With GitHub version, it would be:

library(shiny)
library(datamods)
library(esquisse)

ui <- navbarPage(
  title = "My navbar app",
  id = "nav",
  tabPanel(
    title = "Import",
    fluidRow(
      column(
        width = 6, offset = 3,
        import_file_ui(id = "import_file")
      )
    )
  ),
  tabPanel(
    title = "esquisse",
    esquisse_ui(
      id = "esquisse", 
      header = FALSE,
      container = esquisseContainer(
        fixed = c(55, 0, 0, 0)
      )
    )
  )
)

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

  imported <- import_file_server(id = "import_file")

  rv <- reactiveValues(data = data.frame(), name = "data")
  observeEvent(imported$data(), {
    updateNavbarPage(session, "nav", selected = "esquisse")
    rv$data <- imported$data()
  })

  esquisse_server(
    id = "esquisse",
    data_rv = rv
  )
}

shinyApp(ui, server)

Victor

MatthijsBlom commented 3 years ago

Thanks!