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