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

SNT*_*SNT 4 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)

    }
  )

Run Code Online (Sandbox Code Playgroud)

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

Dea*_*ali 6

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

下一个问题(这是您要问的实际问题)是您传递给模块的值当前仅作为一个快照的常规值传递。它们应该作为反应传递。这有点违反直觉,因为我们认为输入是反应性的,但是当您传递input$reset时,您正在向模块传递此时的特定值。相反,您需要传递它reactive(input$reset),然后在模块中使用reset()而不是 with访问它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))

  }
)
Run Code Online (Sandbox Code Playgroud)


MrF*_*ick 5

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

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

这是更改后的应用程序。注意明确的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))        
  }
)
Run Code Online (Sandbox Code Playgroud)