代码之家  ›  专栏  ›  技术社区  ›  SNT

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

  •  0
  • SNT  · 技术社区  · 7 年前

    我正在开发一个闪亮的应用程序,在加载时它会显示一个默认表。有一个用户输入,当我输入并单击run时应该更新表。当点击重置时,它也会显示默认值表.As现在我可以查看默认表了,当我单击run按钮时什么也没有发生。

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

    创建日期:2019-02-13 reprex package

    0 回复  |  直到 7 年前
        1
  •  5
  •   MrFlick    7 年前

    ()

    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
  •  4
  •   DeanAttali    7 年前

    您的代码存在一些问题,使其当前不可复制: 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))
    
      }
    )
    
    推荐文章