【问题标题】:Unable to pass user inputs into R shiny modules无法将用户输入传递到 R 闪亮模块
【发布时间】:2019-02-14 03:16:46
【问题描述】:

我正在开发一个闪亮的应用程序,在加载时它会显示一个默认表。有一个用户输入,当我输入并单击运行时应该更新表格。而且当点击重置时,它应该显示默认表。截至目前,我可以查看默认表,当我点击运行按钮时没有任何反应。

optimzation <- function(input, output, session, data,budget,run,reset) {

  v <- reactiveValues(data = data)

  observeEvent(run, {
    v$data <- data %>% mutate(carb = mpg * budget)
  })

  observeEvent(reset, {
    v$data <- data # your default data
  })  

  output$mod_table <- DT::renderDataTable({
    DT::datatable(v$data, filter = "top")
  })
}

optimzationUI <- function(id) {
  ns <- NS(id)
  dataTableOutput(ns("mod_table"))

}

shinyApp(
    ui = basicPage(
      mainPanel(
        numericInput("budget_input", label = h5("Total Budget"), value = 9000000),
        actionButton("opt_run", "Run"),
        actionButton("opt_reset", "Reset"),
        tags$hr(),
        optimzationUI("optimize")
      )
    ),
    server = function(input, output) {
      demodata<-mtcars
      callModule(optimzation,"optimize", demodata,budget=input$budget_input,run=input$opt_run,reset = input$opt_reset)

    }
  )

reprex package (v0.2.1.9000) 于 2019 年 2 月 13 日创建

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    在将全局用户输入传递给闪亮的模块时,您似乎需要更加小心。似乎它会“破坏”反应性。您可以通过显式传递一个反应对象来解决这个问题。这是更新的模块。注意添加的() 以获取当前的反应值。

    optimzation <- function(input, output, session, data, budget,run,reset) {
    
      v <- reactiveValues(data = data)
    
      observeEvent(run(), {
        v$data <- data %>% mutate(carb = mpg * budget())
      })
    
      observeEvent(reset(), {
        v$data <- data 
      })  
    
      output$mod_table <- DT::renderDataTable({
        DT::datatable(v$data, filter = "top")
      })
    }
    
    optimzationUI <- function(id) {
      ns <- NS(id)
      DT::dataTableOutput(ns("mod_table"))      
    }
    

    这是更改后的应用程序。注意明确的reactive(input$....)

    library(shiny)
    library(dplyr)
    shinyApp(
      ui = basicPage(
        mainPanel(
          numericInput("budget_input", label = h5("Total Budget"), value = 9000000),
          actionButton("opt_run", "Run"),
          actionButton("opt_reset", "Reset"),
          tags$hr(),
          optimzationUI("optimize")
        )
      ),
      server = function(input, output) {
        demodata<-mtcars
        callModule(optimzation,"optimize", 
                   data=demodata,
                   budget=reactive(input$budget_input),
                   run=reactive(input$opt_run),
                   reset = reactive(input$opt_reset))        
      }
    )
    

    【讨论】:

      【解决方案2】:

      您的代码存在一些问题,使其当前无法重现:需要添加library(shiny)library(dplyr),并且dataTableOutput 需要以DT::dataTableOutput 为前缀。

      下一个问题(这是您要问的实际问题)是您传递给模块的值当前正在一个快照中作为常规值及时传递。它们应该作为反应物传递。这有点违反直觉,因为我们认为输入是反应式的,但是当您传递 input$reset 时,您此时正在向模块传递特定值。相反,您需要传递它reactive(input$reset),然后在模块中使用reset() 而不是reset 访问它。传递给模块的其他反应式也是如此。

      这是完整的代码解决方案:

      library(shiny)
      library(dplyr)
      
      optimzation <- function(input, output, session, data,budget,run,reset) {
      
        v <- reactiveValues(data = data)
      
        observeEvent(run(), {
          v$data <- data %>% mutate(carb = mpg * budget())
        })
      
        observeEvent(reset(), {
          v$data <- data # your default data
        })  
      
        output$mod_table <- DT::renderDataTable({
          DT::datatable(v$data, filter = "top")
        })
      }
      
      optimzationUI <- function(id) {
        ns <- NS(id)
        DT::dataTableOutput(ns("mod_table"))
      
      }
      
      shinyApp(
        ui = basicPage(
          mainPanel(
            numericInput("budget_input", label = h5("Total Budget"), value = 9000000),
            actionButton("opt_run", "Run"),
            actionButton("opt_reset", "Reset"),
            tags$hr(),
            optimzationUI("optimize")
          )
        ),
        server = function(input, output) {
          demodata<-mtcars
          callModule(optimzation,"optimize", demodata,
                     budget = reactive(input$budget_input),
                     run = reactive(input$opt_run),
                     reset = reactive(input$opt_reset))
      
        }
      )
      

      【讨论】:

        猜你喜欢
        • 2016-03-26
        • 2021-11-19
        • 2021-10-29
        • 1970-01-01
        • 2021-05-27
        • 2020-09-11
        • 2015-05-06
        • 2017-11-14
        • 2013-07-14
        相关资源
        最近更新 更多