Как правильно использовать checkboxInput 'All / None' в контексте uiOutput в R Shiny? - PullRequest
0 голосов
/ 09 мая 2019

Вот контекст:

library(shiny)

liste_statut <- c("A","B","C")

ui <- shinyUI(fluidPage(uiOutput("testUI")))
server <- function(input, output, session) {

   output$testUI <- renderUI({

    navbarPage(
      title = "Test",

  tabPanel(icon = icon("users"), 'Test',

           sidebarPanel(
             # Statut
             checkboxGroupInput("statut", "Statut", liste_statut, liste_statut),
             checkboxInput('selectall_statut', 'Tout / Aucun', T))))

})

  # observe({
  #   updateCheckboxGroupInput(
  #     session, 'statut', choices = liste_statut,
  #     selected = if (input$selectall_statut) liste_statut
  #   )
  # })
}

 shinyApp(ui = ui, server = server)

Я хотел бы использовать мой флажок Все / Нет (в строках комментария) правильно, потому что в этом случае у меня появляется «Предупреждение: Ошибка в случае: аргумент имеет нулевую длину». Куда мне его поместить или, может быть, мне следует правильно переопределить что-то в части интерфейса?

Я охотно использую опцию renderUI / uiOutput (в отличие от «стандартного режима» пользовательского интерфейса / сервера), потому что в будущем я добавлю модуль аутентификации, поэтому буду иметь возможность отображать несколько «панелей» в зависимости от пользователя.

Спасибо и извините за мой ужасный английский:).

1 Ответ

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

У меня работает следующее:

library(shiny)
liste_statut <- c("A","B","C")

ui <- shinyUI(fluidPage(uiOutput("testUI")))
server <- function(input, output, session) {

  output$testUI <- renderUI({

    navbarPage(
      title = "Test",

      tabPanel(icon = icon("users"), 'Test',

               sidebarPanel(
                 # Statut
                 checkboxGroupInput("statut", "Statut", liste_statut, liste_statut),
                 checkboxInput('selectall_statut', 'Tout / Aucun', T))))

  })

  observeEvent(input$selectall_statut,{
    val <- liste_statut
    if(!input$selectall_statut)
      val <- character(0)

    updateCheckboxGroupInput(
      session, 'statut', 
      selected = val
    )
  })
}

Сначала я попытался selected = ifelse(input$selectall_statut, liste_statut, character(0)) вместо промежуточной переменной val.Однако ifelse() вернул только одно значение, а не вектор.

Если вы собираетесь делать это много раз, то я бы порекомендовал пользовательскую функцию ifelse.Возможно что-то вроде следующего:

ifelse2 <- function(test, yes, no){
    if(test)
        return(yes)
    return(no)
}
...