условная панель, где условие - длина ввода - PullRequest
2 голосов
/ 07 августа 2020

Мне сложно понять, почему мое условие input.wave1.length > 1 не работает.

Я бы хотел, чтобы флажок «Общая кривая» не отображался, если не input$loess И если есть другие чем 1 элемент отмечен в аккордеонах Волны 1 или Волны 2.

Я не вижу, что я делаю неправильно. Есть ли в javascript условие, которое заставит эту работу работать, или это можно сделать с помощью сценария R?

мое приложение:

library(shiny)
library(shinydashboard)
library(bsplus) #accordion


#########define waves##########
wave1 <- c(
  "Cayuga", "Columbia", "Erie", "Greene", 
  "Lewis", "Putnam", "Suffolk", "Ulster" 
)

wave2 <- c(
  "Broome", "Chautauqua", "Cortland", "Genesee",
  "Monroe", "Orange", "Sullivan", "Yates" 
)

ui <- dashboardPage(
  dashboardHeader(title = "Example"),
  dashboardSidebar(
    tags$h4("waves:", style = "margin: 5px;"),
    bs_accordion(id = "waves") %>% 
      #use the entire heading panel as a link instead of just title
      bs_set_opts(use_heading_link = TRUE) %>% 
      bs_append(
        title = "Wave 1",
        content = checkboxGroupInput(inputId = "wave1", label = NULL,
                                     choices = c(wave1, "All Wave 1"),
                                     selected = "Cayuga")
      ) %>% 
      bs_append(
        title = "Wave 2",
        content = checkboxGroupInput(inputId = "wave2", label = NULL,
                                     choices = c(wave2, "All Wave 2"))
      ),
    br(),
    #LOESS CURVE ####
    checkboxInput(inputId = "loess", label = "Display Loess Curve",
                  value = FALSE),
    uiOutput("loess_a"),
    # uiOutput("loess_overall"),
    conditionalPanel(condition = "input.loess == TRUE & input.wave1.length > 1",  # should include selected > 1
                     checkboxInput(inputId = "loessGrouped", label = "Overall Curve",
                                   value = TRUE)
    )
  ),
  dashboardBody(
    tags$style(HTML('.checkbox label{color: red;}'))
  )
)

server <- function(input, output, session) {
  
  # conditional loess smoother #######
  output$loess_a <- renderUI({
    req(input$loess)
    conditionalPanel(condition = "input.loess == TRUE",
                     sliderInput(inputId = "smoothing", label = NULL,
                                 min = 0, max = 1, value = 1, step = 0.1))
  })
}

shinyApp(ui = ui, server = server)

1 Ответ

1 голос
/ 08 августа 2020

Для работы с аккордеонами Волны 1 или Волны 2, у которых отмечено более 1 элемента, вы можете использовать следующее:

conditionalPanel(condition = "input.loess == 1 & (input.wave1.length > 1 || input.wave2.length > 1)",  # should include selected > 1
                     checkboxInput(inputId = "loessGrouped", label = "Overall Curve",
                                   value = TRUE)
    )

Кроме того, вам все равно нужно сделать input.loess == 1 на стороне сервера

...