RStudio Shiny динамический выбор

В моем RStudio Shiny я получил свой selectInput внутри своего server.R, а на ui.R я получил оператор tags для изменения ширины и высоты поля выбора.

Он работает, когда страница загружается, но возвращается к размеру по умолчанию, когда я перехожу к одному типу. Любые идеи, как это решить?

On ui.R

# [...]
  ,div(class="span6"
   ,radioButtons("viz_multiple", "Select Type:",
          c("Select From List (can use Up/Down + Enter)" = "multiple",
            "Search One (Delete then type keyword)"  = "single")
    )
   )
  )
  ,div(class='row-fluid'
  ,div(class='span12', uiOutput("image_list"))
  ,tags$head(tags$style(type="text/css", "select#iimage_list             { width: 1000px; height: 40px; }"))
  )
 # [...]

На сервере.R

# [...]

output$image_list <- renderUI({
  imagelist = image_ls()
  iimage_list <- as.vector(sort(unique(as.character(imagelist)),decreasing=TRUE))
  length_list = length(iimage_list)
  selectInput("iimage_list",paste0("samples (",length_list,")"),choices=iimage_list, selectize = input$viz_multiple == 'single')
})
# [...]

Есть идеи, как применить команду tags, когда пользователь переключается с multiple на single?


person 719016    schedule 18.11.2014    source источник


Ответы (1)


Вам также нужно добавить css динамически. Чтобы настроить таргетинг на вход selectize, вам нужно настроить таргетинг на select#dataset + .selectize-control, а не на select#dataset.

библиотека (блестящая)

runApp(list(
  ui = bootstrapPage(
    radioButtons("viz_multiple", "Select Type:",
                 c("Select From List (can use Up/Down + Enter)" = "multiple",
                   "Search One (Delete then type keyword)"  = "single")
    )
    , uiOutput("myUI")
  ),
  server = function(input, output){
    output$myUI <- renderUI({
      myCSS <-if(input$viz_multiple == 'single'){
        tags$style(type="text/css", "select#dataset + .selectize-control{ width: 1000px; height: 40px; }")
      }else{
        tags$style(type="text/css", "select#dataset { width: 1000px; height: 40px; }")
      }
      tagList(
        selectInput('dataset', 'Choose Dataset', c('mtcars', 'iris'), selectize = (input$viz_multiple == 'single'))
        , myCSS
      )
    })
  }
))

или иметь две отдельные записи CSS, одну для select и одну для selectize:

library(shiny)
runApp(list(
  ui = bootstrapPage(
    radioButtons("viz_multiple", "Select Type:",
                 c("Select From List (can use Up/Down + Enter)" = "multiple",
                   "Search One (Delete then type keyword)"  = "single")
    )
    , uiOutput("myUI")
    , tags$style(type="text/css", "select#dataset + .selectize-control{ width: 1000px; height: 40px; }")
    , tags$style(type="text/css", "select#dataset { width: 1000px; height: 40px; }")
  ),
  server = function(input, output){
    output$myUI <- renderUI({
      selectInput('dataset', 'Choose Dataset', c('mtcars', 'iris'), selectize = (input$viz_multiple == 'single'))
    })
  }
))
person jdharrison    schedule 18.11.2014
comment
Я скопировал + вставил эту новую версию, но она ничем не отличается от исходной. Если я удалю соответствующий оператор tags в ui.R и просто использую новую версию в вашем ответе, то же самое поведение... - person 719016; 18.11.2014
comment
Вам нужно будет предоставить воспроизводимый код, иначе трудно комментировать дальше. - person jdharrison; 18.11.2014
comment
Тот факт, что он изменяет его размер до нужного размера при загрузке страницы с версией в вашем ответе, заставляет меня думать, что он правильно применяет tagList. Но когда я меняю параметр input$viz_multiple на загруженной странице, он возвращается к размеру по умолчанию... - person 719016; 18.11.2014