我正在开发一个在golem中显示数据的闪亮应用程序。我希望用户能够选择一个数据集。这是我第一次尝试从闪亮模块传递反应值,并且由于某种原因,当选择另一个数据集时,DT没有更新。下面复述一下,谢谢你的帮助!
reprex::reprex({
library(tidyverse)
library(shiny)
# modules -----------------------------------------------------------------
## filter_source----------------------------------------------------------
mod_filter_source_ui <- function(id) {
ns <- NS(id)
tagList(
shiny::selectInput(
ns("dataset"),
label = "select dataset",
choices = c("cars", "pressure", "diamonds"),
selectize = TRUE
))
}
mod_filter_source_server <- function(id) {
moduleServer(id, function(input, output, session) {
ns <- session$ns
df_dataset <- shiny::reactive({
switch(input$dataset,
"cars"= cars,
"pressure" = pressure,
"diamonds" = diamonds)
})
return(df_dataset)
})
}
## render_table ------------------------------------------------------------
mod_table_ui <- function(id){
ns <- NS(id)
tagList(
DT::dataTableOutput(ns("table_out"))
)
}
mod_table_server <- function(id, df){
moduleServer( id, function(input, output, session){
ns <- session$ns
output$table_out <- DT::renderDataTable(df)
})
}
# ui ----------------------------------------------------------------------
app_ui <- function(request) {
tagList(
fluidPage(
mod_filter_source_ui("selected_dataset"),
mod_table_ui("main_table")
)
)
}
# server ------------------------------------------------------------------
app_server <- function(input, output, session) {
df_dataset_val <- mod_filter_source_server("selected_dataset")
mod_table_server("main_table", df = df_dataset_val())
}
# run ---------------------------------------------------------------------
shinyApp(app_ui, app_server)
})
a反应性(df_dataset_val
)与反应性(df_dataset_val()
)的值有细微的差别。您在过滤器模块服务器的定义中做对了,并返回了响应而不是它的值。但是你在调用表模块服务器时出错了,传递了响应的当前值,而不是响应本身。
用mod_table_server("main_table", df = df_dataset_val)
代替mod_table_server("main_table", df = df_dataset_val())
,应该就可以了。
请参阅"Writing server function ">