如何使用闪亮的模块导入数据、选择变量并生成绘图?

Typ*_*ter 1 r shiny

我正在尝试上传数据,然后从上传的数据中选择变量以生成散点图。

  1. 导入模块:从csv文件导入数据并显示预览表
  2. 选择模块:从导入的数据集中选择变量
  3. 散点图模块:根据选定的变量生成散点图。

我所关心的问题

  1. 在右侧模块中找到导入的数据。
  2. 使用 csv 文件中的变量更新 selectInput 选项
  3. 以正确的方式连接模块

为了解决这个问题,我觉得我必须添加一个observe地方并将其连接到其他模块。像这样的东西observe({updateSelectInput(session, "var1", choices = names(dtreact()))})

现在应用程序无法运行并输出以下错误:Error in varselect_ui("select") : object 'dtreact' not found

这是示例.csv 文件的链接

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)
Run Code Online (Sandbox Code Playgroud)

代码改编自此示例

sta*_*rja 7

您不需要observe,而是需要一种将模块的输出链接到模块的输入的智能方法。因此,请return在生成应由其他模块使用的数据的模块中使用,并将这些值存储在主server函数中的变量中。然后您可以将这些变量用作其他模块的输入。同样重要的是,如果您将反应作为输入传递给模块,则需要不对它们进行求值(因此传递dataset而不是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)
Run Code Online (Sandbox Code Playgroud)