我正在开发一个闪亮的应用程序,它在加载时显示一个默认表。有一个用户输入,当我输入并单击运行时应该更新表。而且当点击重置它应该显示默认表。截至现在我能够查看默认表并且当我点击运行按钮时没有任何反应。
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 日创建
您的代码存在一些问题,使其当前无法重现:需要添加,并且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)
在将全局用户输入传递给闪亮的模块时,您似乎需要更加小心。似乎它会“破坏”反应性。您可以通过我显式传入反应式对象来解决此问题。这是更新的模块。请注意添加()以获取当前无功值。
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)