我有一个
shiny
应用程序,其中使用 ui
标签生成多个 div(id = ...
元素。之后,用户可以在显示/隐藏之间切换。我注意到一个意外的动作,当我第二次单击 run/Graph
时,没有情节。但是,如果我使用 picker
并更改为另一列,我会得到图表。但我不明白为什么当我第二次点击actionbutton
时看不到图表,但当我第一次点击时却看到了。
choices <- colnames(iris)
library(shiny)
library(tidyverse)
library(bslib)
library(glue)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
pickerInput("col_x", "X", choices = choices, multiple = TRUE),
actionButton("run", "Graph"),
uiOutput("choose_column_ui"),
uiOutput("ui")
)
server <- function(input, output, session) {
reactive_values <- reactiveValues()
observeEvent(input$run, {
cols <- input$col_x
ggplot_string <- map_chr(cols, ~glue("ggplot(iris, aes(x = {.x}, y = Species)) + geom_point() + labs(title = '{.x}')"))
all_plots <- map(ggplot_string, ~eval(parse(text = .x))) %>% set_names(cols)
# Save all plots to the output
lapply(cols, function(x) output[[x]] <- renderPlot(all_plots[[x]]))
# Generate all the cards
generate_plot_card <- function(column){
hidden(div(id = column,
card(
card_body(plotOutput(column)),
full_screen = TRUE
)
)
)
}
all_cards <- map(cols, generate_plot_card)
new_picker <- pickerInput("choose_column_to_view", "Choose_col", choices = cols, selected = cols[[1]], multiple = FALSE)
output$choose_column_ui <- renderUI(new_picker)
output$ui <- renderUI(tagList(all_cards))
reactive_values$cols <- cols
})
# Observeevent to show/hide
observeEvent(input$choose_column_to_view, {
# Hide everything
map(reactive_values$cols, ~shinyjs::hide(id = .x))
# Show 1
map(input$choose_column_to_view, ~shinyjs::show(id = .x))
})
}
shinyApp(ui, server)
虽然我知道为什么会发生这种情况,但我在
generate_plot_card
中添加了一个额外的参数,隐藏了除第一张卡之外的所有卡片,这似乎解决了问题。我还可以删除 hidden()
,但这会导致加载绘图时出现快速故障。