当我在 Shiny 中第二次刷新时,所有元素都隐藏了

问题描述 投票:0回答:1

我有一个

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)
r shiny
1个回答
0
投票

虽然我知道为什么会发生这种情况,但我在

generate_plot_card
中添加了一个额外的参数,隐藏了除第一张卡之外的所有卡片,这似乎解决了问题。我还可以删除
hidden()
,但这会导致加载绘图时出现快速故障。

© www.soinside.com 2019 - 2024. All rights reserved.