Próbuję przesłać dane, a następnie wybierz zmienne z przesłanych danych, aby wygenerować działkę rozproszoną.

  1. Moduł importu: Importuj dane z pliku CSV i tabeli podglądu
  2. Wybierz moduł: Wybierz zmienne z importowanego zestawu danych
  3. Moduł SPRECESPLOT: Wygeneruj rozproszór na podstawie wybranych zmiennych.

Obawy, które wiązałem

  1. Zlokalizowanie importowanych danych w prawym module.
  2. Aktualizowanie opcji SelectInput z zmiennymi z pliku CSV
  3. Podłączanie modułów właściwy sposób

Aby to rozwiązać, czuję, że muszę gdzieś dodać observe i podłączyć go do innych modułów. Coś takiego jak observe({updateSelectInput(session, "var1", choices = names(dtreact()))})

W tej chwili aplikacja nie działa i wyjściu tego błędu: Error in varselect_ui("select") : object 'dtreact' not found

Oto link do przykładu .csv Plik

library(shiny)
library(dplyr)
library(rlang)
library(ggplot2)



scatter_plot <- function(dataset, xvar, yvar) {
  
  x <- rlang::sym(xvar)
  y <- rlang::sym(yvar)
  
  p <- ggplot(dataset, aes(x = !!x, y = !!y)) +
    geom_point() +
    theme(axis.title = element_text(size = rel(1.2)),
          axis.text = element_text(size = rel(1.1)))
  
  return(p)
  
}

importUI <- function(id) {
  ns <- NS(id)
  
  tagList(
    fileInput(ns("file1"), "Choose CSV File", accept = ".csv"),
    checkboxInput(ns("header"), "Header", TRUE),
    tableOutput(ns("contents"))
  )
  
}

importSE <- function(id) {
  moduleServer(id, 
               function(input, output, session) {
                 
                 dtreact <- reactive({
                   file <- input$file1
                   if (is.null(file))
                     return(NULL)
                   read.csv(file$datapath, header = input$header)
                 })
                 
                 
                 output$contents <- renderTable({
                   dtreact()
                 })
          }
  )
  
}

varselect_ui <- function(id) {
  ns <- NS(id)
  var_choices <- names(dtreact)
  tagList(selectInput(ns("xvar"), "Select X variable", choices = var_choices, selected = NULL),
          selectInput(ns("yvar"), "Select Y variable", choices = var_choices, selected = NULL))
}

varselect_server <- function(id) {
  moduleServer(id,
               function(input, output, session) {
  return(
    list(
      xvar = reactive({input$xvar}),
      yvar = reactive({input$yvar})
    )
  )
                 }
  )
}

scatterplot_ui <- function(id) {
  ns <- NS(id)
  plotOutput(ns("plot1"))
  
}

scatterplot_server <- function(id) {
  moduleServer(id, 
               function(input, output, session, dataset, plot1vars, plot2vars) {
  
  plot1_obj <- reactive({
    p <- scatter_plot(dataset, xvar = plot1vars$xvar(), yvar = plot1vars$yvar())
    return(p)
  })
  
  output$plot1 <- renderPlot({
    plot1_obj()
  })
  }
  )
}






ui <- fluidPage(
  importUI("import"),
  varselect_ui("select"),
  scatterplot_ui("scatter")
)



server <- function(input, output, session) {
  importSE("import")
  varselect_server("select")
  scatterplot_server("scatter")
  
}

shinyApp(ui, server)

Kod został przystosowany z Ten przykład

0
Typer Writer 17 październik 2020, 07:23

1 odpowiedź

Najlepsza odpowiedź

Nie potrzebujesz observe, ale inteligentny sposób na połączenie wyjść modułów do wejść modułów. Dlatego należy użyć return w modułach, które wytwarzają dane, które powinny być używane przez inne moduły i przechowywać te wartości w funkcji głównego server w zmiennych. Te zmienne można następnie użyć jako wejścia do innych modułów. Ważne jest również, że jeśli przejdziesz reakcję jako wejścia do modułów, muszą być nierówne (więc pass dataset zamiast dataset()):

library(shiny)
library(dplyr)
library(rlang)
library(ggplot2)



scatter_plot <- function(dataset, xvar, yvar) {
  
  x <- rlang::sym(xvar)
  y <- rlang::sym(yvar)
  
  p <- ggplot(dataset, aes(x = !!x, y = !!y)) +
    geom_point() +
    theme(axis.title = element_text(size = rel(1.2)),
          axis.text = element_text(size = rel(1.1)))
  
  return(p)
  
}

importUI <- function(id) {
  ns <- NS(id)
  
  tagList(
    fileInput(ns("file1"), "Choose CSV File", accept = ".csv"),
    checkboxInput(ns("header"), "Header", TRUE),
    tableOutput(ns("contents"))
  )
  
}

importSE <- function(id) {
  moduleServer(id, 
               function(input, output, session) {
                 
                 dtreact <- reactive({
                   file <- input$file1
                   if (is.null(file))
                     return(NULL)
                   read.csv(file$datapath, header = input$header)
                 })
                 
                 
                 output$contents <- renderTable({
                   dtreact()
                 })
                 
                 return(dtreact)
               }
  )
  
}

varselect_ui <- function(id) {
  ns <- NS(id)
  var_choices <- ""
  tagList(selectInput(ns("xvar"), "Select X variable", choices = var_choices, selected = NULL),
          selectInput(ns("yvar"), "Select Y variable", choices = var_choices, selected = NULL))
}

varselect_server <- function(id, dataset) {
  moduleServer(id,
               function(input, output, session) {
                 observeEvent(dataset(), {
                   updateSelectInput(session,
                                     "xvar",
                                     choices = names(dataset()))
                   updateSelectInput(session,
                                     "yvar",
                                     choices = names(dataset()))
                 })
                 
                 return(
                   list(
                     xvar = reactive({input$xvar}),
                     yvar = reactive({input$yvar})
                   )
                 )
               }
  )
}

scatterplot_ui <- function(id) {
  ns <- NS(id)
  plotOutput(ns("plot1"))
  
}

scatterplot_server <- function(id, dataset, plot1vars, plot2vars) {
  moduleServer(id, 
               function(input, output, session) {
                 
                 plot1_obj <- reactive({
                   req(dataset())
                   p <- scatter_plot(dataset(), xvar = plot1vars(), yvar = plot2vars())
                   return(p)
                 })
                 
                 output$plot1 <- renderPlot({
                   plot1_obj()
                 })
               }
  )
}






ui <- fluidPage(
  importUI("import"),
  varselect_ui("select"),
  scatterplot_ui("scatter")
)



server <- function(input, output, session) {
  dataset <- importSE("import")
  plotvars <- varselect_server("select", dataset = dataset)
  scatterplot_server("scatter", dataset = dataset, plot1vars = plotvars$xvar,
                     plot2vars = plotvars$yvar)
  
}

shinyApp(ui, server)
2
starja 17 październik 2020, 14:08