RStudio Shiny 动态选择 selectize

3
在我的RStudio Shiny中,我在server.R中使用了selectInput,在ui.R中使用tags语句来改变选择框的宽度和高度。页面加载时可以正常工作,但当我转到单选类型时会恢复默认大小。有什么解决方法吗?
在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; }"))
  )
 # [...]

On server.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')
})
# [...]

您有没有任何想法如何在用户从 multiple 切换到 single 时也应用 tags 命令?

1个回答

2

您需要动态添加CSS。要针对selectize输入进行定位,您需要针对 select#dataset + .selectize-control 进行定位,而不是 select#dataset

库(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")
  ),
  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'))
    })
  }
))

我复制粘贴了这个新版本,但它的行为与原始版本没有任何区别。如果我在 ui.R 中删除相应的 tags 语句,并只使用你答案中的新版本,行为也是一样的... - 719016
如果你没有提供可复现的代码,那么很难进一步评论。 - jdharrison
它在加载您回答中的版本时将其调整为正确的大小,这使我认为它正在正确地应用tagList。但是,当我更改已加载页面中的input$viz_multiple选项时,它会返回到默认大小... - 719016

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接