如何在R中从renderUI触发renderDataTable进行输入?
我正在开发一个简单的应用程序,使用R将数据库数据显示为数据表 从数据库查询的数据可能会更改,因此我希望根据当前的数据定制过滤输入选项,因此,我正在使用renderUI在服务器中生成UI。问题是RenderRui的输入没有触发renderDataTable,因此在操作按钮触发renderDataTable之前,它是空的。我想让renderDataTable的输入触发renderDataTable 例如,这是一个小应用程序,可以按照我的要求运行,但它的过滤输入是静态的,因此我无法使用它:如何在R中从renderUI触发renderDataTable进行输入?,r,shiny,R,Shiny,我正在开发一个简单的应用程序,使用R将数据库数据显示为数据表 从数据库查询的数据可能会更改,因此我希望根据当前的数据定制过滤输入选项,因此,我正在使用renderUI在服务器中生成UI。问题是RenderRui的输入没有触发renderDataTable,因此在操作按钮触发renderDataTable之前,它是空的。我想让renderDataTable的输入触发renderDataTable 例如,这是一个小应用程序,可以按照我的要求运行,但它的过滤输入是静态的,因此我无法使用它: ui &l
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput(
"fish_taste", "Please select fish taste:",
choices = c("good", "bad"),
selected = c("good", "bad"),
multiple = TRUE
),
actionButton("submit", "Submit")
),
mainPanel(
DT::dataTableOutput("dt")
))
)
server <- function(input, output) {
data <- data.frame(fish = c("jellyfish", "tuna", "salmon", "magikarp"),
cost = c("$", "$$$", "$$", "$"),
taste = c("bad", "good", "good", "bad"))
filtered_fish <- reactive({
data[ data$taste %in% input$fish_taste, ]
})
filtered_fish_click <- reactiveVal(
value = isolate(filtered_fish())
)
observeEvent(input$submit, {
filtered_fish_click( filtered_fish() )
})
output$dt <- DT::renderDataTable({
datatable(
filtered_fish_click(),
rownames = FALSE,
options = list(
pageLength = 100,
lengthChange = FALSE
)
)
})
}
ui只需初始化fish\u点击bydata
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
uiOutput("fish_taste"),
actionButton("submit", "Submit")
),
mainPanel(
DT::dataTableOutput("dt")
))
)
server <- function(input, output) {
data <- data.frame(fish = c("jellyfish", "tuna", "salmon", "magikarp"),
cost = c("$", "$$$", "$$", "$"),
taste = c("bad", "good", "good", "bad"))
output$fish_taste = renderUI({
fish_taste_choices <- sort(unique(data$taste), decreasing = TRUE)
fish_taste_choices_initial <- fish_taste_choices
selectInput(
"fish_taste", "Please select fish taste:",
choices = fish_taste_choices,
selected = fish_taste_choices_initial,
multiple = TRUE
)
})
filtered_fish <- reactive({
data[ data$taste %in% input$fish_taste, ]
})
filtered_fish_click <- reactiveVal(
value = isolate(data)
)
observeEvent(input$submit, {
filtered_fish_click( filtered_fish() )
})
output$dt <- DT::renderDataTable({
DT::datatable(
filtered_fish_click(),
rownames = FALSE,
options = list(
pageLength = 100,
lengthChange = FALSE
)
)
})
}
shinyApp(ui, server)
ui谢谢,这个答案正是我想要的。但是,它是静态的,例如,如果我在服务器中更改了fish\u taste\u choices\u initial
的值,我默认只选择“good”,加载时显示的数据表将不会反映默认过滤器。在显示数据表之前,您知道如何应用筛选器吗?只需使用初始筛选器作为新变量筛选数据
,然后将此新变量传递到我更改的位置。
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
uiOutput("fish_taste"),
actionButton("submit", "Submit")
),
mainPanel(
DT::dataTableOutput("dt")
))
)
server <- function(input, output) {
data <- data.frame(fish = c("jellyfish", "tuna", "salmon", "magikarp"),
cost = c("$", "$$$", "$$", "$"),
taste = c("bad", "good", "good", "bad"))
output$fish_taste = renderUI({
fish_taste_choices <- sort(unique(data$taste), decreasing = TRUE)
fish_taste_choices_initial <- fish_taste_choices
selectInput(
"fish_taste", "Please select fish taste:",
choices = fish_taste_choices,
selected = fish_taste_choices_initial,
multiple = TRUE
)
})
filtered_fish <- reactive({
data[ data$taste %in% input$fish_taste, ]
})
filtered_fish_click <- reactiveVal(
value = isolate(data)
)
observeEvent(input$submit, {
filtered_fish_click( filtered_fish() )
})
output$dt <- DT::renderDataTable({
DT::datatable(
filtered_fish_click(),
rownames = FALSE,
options = list(
pageLength = 100,
lengthChange = FALSE
)
)
})
}
shinyApp(ui, server)