无法将用户输入传递给R闪亮模块

时间:2019-02-13 18:27:09

标签: r shiny

我正在使用一个闪亮的应用程序,该应用程序在加载时会显示一个默认表。有一个用户输入,当我输入并单击运行时,应该更新该表。而且,当单击“重置”时,它应该显示默认表。到目前为止,我已经能够查看默认表,而单击“运行”按钮时什么也没有发生。

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-02-13创建

2 个答案:

答案 0 :(得分:2)

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

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))        
  }
)

答案 1 :(得分:2)

您的代码存在一些问题,使其目前无法再现:library(shiny)library(dplyr)需要添加,并且dataTableOutput必须以{{1}为前缀}。

下一个问题(这是您要询问的实际问题)是,您正在传递给模块的值当前正好在一次快照中作为常规值传递。它们应作为反应堆传递。这有点反直观,因为我们认为输入是无功的,但是当您传递DT::dataTableOutput时,您将在此时传递模块的特定值。相反,您需要传递它input$reset,然后在模块中使用reactive(input$reset)而不是reset()访问它。传递给模块的其他反应堆也是如此。

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

reset