Динамическое удаление раскрывающегося элемента пользовательского интерфейса в R Shiny - PullRequest
0 голосов
/ 09 мая 2020

Вероятно, очень простой c вопрос - но не могу перевести похожие сообщения, которые я нашел, на мою точную проблему.

В приложении R Shiny у меня есть первое раскрывающееся меню, которое заполняется вектором, созданным на сервере - это позволяет мне сделать один набор вариантов.

Я хочу иметь поле для галочки, которое затем вводит второй раскрывающийся список, но я хочу, чтобы этот раскрывающийся список исчез, если я не -поставьте галочку.

У меня был go - см. MWE ниже - график нужен только для того, чтобы сохранить структуру моего исходного кода (очевидно, я знаю, что мои раскрывающиеся списки ничего, но это не тот случай в оригинале, но хотелось, чтобы MWE был как можно более "M").

Если я удалю строку removeUI(), то при установке флажка будет создан новый раскрывающийся список по мере необходимости, но затем снятие флажка не приведет к его удалению.

Мне явно чего-то не хватает; любая помощь, которую я очень ценю, так как я полностью отстой в R Shiny, но действительно хочу поправиться!

library(shiny)
library(shinyMobile)

# define UI elements
ui <- f7Page(

  f7SingleLayout(
    navbar = f7Navbar(
    ),
    f7Card(htmlOutput("initial_drop_down"), #first drop down
           f7checkBox(inputId = "switch", label = "Introduce second choice", FALSE), #tick box for second drop down if required
           htmlOutput("reactive_drop_down") #second drop down
    ),
    f7Shadow(
      intensity = 16,
      f7Card(
        plotOutput("distPlot", height = "800px") # plot - originally linked to drop down choices but an arbitrary graph here for simplicity
      )
    )  
  )


)

# server calculations
server <- function(input, output) {
  library(ggplot2)

  # generate first drop down - done on server side since usually choices vector is comprised of information read in from files
  output$initial_drop_down = renderUI({ 
    selectInput(inputId = "initial_choice",
                label = "First choice:",
                choices = c("Choice 1", "Choice 2", "Choice 3")) 
  })

  observeEvent(input$initial_choice, {

    # trying to add second drop down based on action in switch - not convinced my use of observeEvent is quite right - issue likely sits in here.
    observeEvent(input$switch, {

      if(input$switch == T){

        output$reactive_drop_down = renderUI({ 
          selectInput(inputId = "second_choice", 
                      label = "Second (dynamic) choice:", 
                      choices = c(1,2,3)) 
        })
      }else{
        removeUI(selector ="#reactive_drop_down")
      }
    })

    output$distPlot <- renderPlot({
      ggplot(data = cars) + geom_line(aes(x=speed, y=dist))
    })
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 09 мая 2020

Не могли бы вы использовать conditionalPanel? Поместите htmlOutput для второго ввода в свой ui. Я бы избегал использования вложенных observeEvent и output.

library(shiny)
library(shinyMobile)
library(ggplot2)

# define UI elements
ui <- f7Page(
  f7SingleLayout(
    navbar = f7Navbar(
    ),
    f7Card(htmlOutput("initial_drop_down"), #first drop down
           f7checkBox(inputId = "switch", label = "Introduce second choice", FALSE), #tick box for second drop down if required
           conditionalPanel(
             condition = "input.switch==1",
             htmlOutput("reactive_drop_down") #second drop down
           )
    ),
    f7Shadow(
      intensity = 16,
      f7Card(
        plotOutput("distPlot", height = "800px") # plot - originally linked to drop down choices but an arbitrary graph here for simplicity
      )
    )  
  )
)

# server calculations
server <- function(input, output) {

  # generate first drop down - done on server side since usually choices vector is comprised of information read in from files
  output$initial_drop_down = renderUI({ 
    selectInput(inputId = "initial_choice",
                label = "First choice:",
                choices = c("Choice 1", "Choice 2", "Choice 3")) 
  })

  output$reactive_drop_down = renderUI({ 
    selectInput(inputId = "second_choice", 
                label = "Second (dynamic) choice:", 
                choices = c(1,2,3)) 
  })

  output$distPlot <- renderPlot({
    ggplot(data = cars) + geom_line(aes(x=speed, y=dist))
  })

}

# Run the application 
shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...