我想有一个选择器输入限制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 代码太远了。