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

6

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

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软件包(v0.2.1.9000)于2019年02月13日创建。

2个回答

9

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

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

6
目前您的代码存在一些问题,导致无法复现:需要添加 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))

  }
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接