r语言 - 使用选择性组的反应式模块没有输出



我想有一个选择器输入限制ShinyWisgets的选择组模块中的选项。我可以使用反应式表达式来使其工作。但是,表中没有生成任何内容供我查看结果。我错过了什么?

我怀疑我在mpg_filter表达式中犯了错误。

# https://dreamrs.github.io/shinyWidgets/reference/selectizeGroup-module.html
library(shiny)
library(shinyWidgets)
data("mpg", package = "ggplot2")
ui <- fluidPage(
fluidRow(
column(
width = 10, offset = 1,
tags$h3("Filter data with selectize group"),
panel(
pickerInput(
inputId = "car_select",
choices = unique(mpg$manufacturer),
options = list(
`live-search` = TRUE,
title = "None selected"
),
),

selectizeGroupUI(
id = "my-filters",
params = list(
manufacturer = list(inputId = "manufacturer", title = "Manufacturer:"),
model = list(inputId = "model", title = "Model:"),
trans = list(inputId = "trans", title = "Trans:"),
class = list(inputId = "class", title = "Class:")
)
),
status = "primary"
),
dataTableOutput(outputId = "table")
)
)
)
server <- function(input, output, session) {
mpg_filter <- reactive({
mpg %>%
filter(mpg$manufacturer %in% input$car_select)
})

res_mod <- reactive({
callModule(
module = selectizeGroupServer,
id = "my-filters",
data = mpg_filter(),
vars = c("manufacturer", "model", "trans", "class")
)
})
output$table <- renderDataTable(res_mod())
}
shinyApp(ui, server)

自 v0.5.0(2019 年 11 月(起,

selectizeGroupServer()(模块selectizeGroup(现在接受反应式数据和反应式 vars 参数,有关详细信息,请参阅示例?selectizeGroupServer

?selectizeGroupServer中的最后一个示例实际上是对这个问题的直接回答:

# Subset data -------------------------------------------------------------
library(shiny)
library(shinyWidgets)
data("mpg", package = "ggplot2")
ui <- fluidPage(
fluidRow(
column(
width = 10, offset = 1,
tags$h3("Filter data with selectize group"),
panel(
pickerInput(
inputId = "car_select",
choices = unique(mpg$manufacturer),
options = list(
`live-search` = TRUE,
title = "None selected"
)
),
selectizeGroupUI(
id = "my-filters",
params = list(
manufacturer = list(inputId = "manufacturer", title = "Manufacturer:"),
model = list(inputId = "model", title = "Model:"),
trans = list(inputId = "trans", title = "Trans:"),
class = list(inputId = "class", title = "Class:")
)
),
status = "primary"
),
DT::dataTableOutput(outputId = "table")
)
)
)
server <- function(input, output, session) {

mpg_filter <- reactive({
subset(mpg, manufacturer %in% input$car_select)
})

res_mod <- callModule(
module = selectizeGroupServer,
id = "my-filters",
data = mpg_filter,
vars = c("manufacturer", "model", "trans", "class")
)

output$table <- DT::renderDataTable({
req(res_mod())
res_mod()
})
}
shinyApp(ui, server)

注意data = mpg_filter(反应式本身,而不是对它的调用(callModule(module = selectizeGroupServer)


时的答案

困难源于这样一个事实,即selectizeGroupServer不接受reactive作为data论点。如果是这样,那就更简单了。解决方法如下:

server <- function(input, output, session) {
mpg_filter <- reactive({
mpg %>%
filter(mpg$manufacturer %in% input$car_select)
})

res_mod <- reactive({})

observe({
res_mod <<- callModule(
module = selectizeGroupServer,
id = "my-filters",
data = mpg_filter(),
vars = c("manufacturer", "model", "trans", "class")
)
})

output$table <- renderDataTable(res_mod())
}

这是另一个:

server <- function(input, output, session) {
mpg_filter <- reactive({
mpg %>%
filter(mpg$manufacturer %in% input$car_select)
})


res_mod <- reactive({
callModule(
module = selectizeGroupServer,
id = "my-filters",
data = mpg_filter(),
vars = c("manufacturer", "model", "trans", "class")
)
})

output$table <- renderDataTable(res_mod()())
}

请注意唯一的更改:res_mod()()。这是因为res_mod()本身是一个反应式的,因为callModule被包装在reactive中(不仅仅是res_mod本身,而是结果调用(,所以我们必须像res_mod()().
这样调用它两次 .br/这在第一个建议中没有发生,但我不得不在初始化res_mod时进行一些破解, 然后<<-,以避免在未定义的情况下调用res_mod时出现错误.
我仍然会选择第一个,因为res_mod()()离惯用的 Shiny 代码太远了。

最新更新