空链未显示为闪亮App中的selectInput中的选项

时间:2014-06-23 12:22:06

标签: r shiny selectize.js

我希望App的用户为他们必须上传的某些文件选择文本包装器。选项是No Wrapper,Double Quotes和Simple Quotes,所以我希望selectInput函数返回"""\"""'",但第一个选项不会出现。我展示了一个虚拟的例子:

ui.R

shinyUI(fluidPage(
  selectInput("quotes","Select Text wrapper", 
              choices= list("None"="","Double Quotes (\")"='"', "Simple Quotes (\')"="'"), 
              selected="'"),
  verbatimTextOutput("value")
))

server.R

shinyServer(function(input,output){
  output$value <- renderPrint({ input$quotes })
})

如何让None选项出现并将空字符值""分配给input$quotes

注意:我知道它适用于selectize=FALSE,但我想保留选择环境的外观。我也知道您可以删除该值并单击框中的空白值,但我认为这对用户来说并不直观,我希望有一个明确的“无”字样。选择。

提前致谢!

1 个答案:

答案 0 :(得分:1)

更新:在查看对selectize.js所做的代码更改,以允许没有值的选项可以用作占位符文本(here)时,看起来没有值的选项优先于显式& #34;占位符&#34;标签。因此,目前版本的库(0.10.1)似乎无法做到这一点。

所以看起来selectize.js人们认为任何带有零长度字符串作为值的选项都将用作占位符文本而不会在输入中列出。 (见this)。这与该元素的html5规范一致。另一种方法是,如果你设置一个&#34;占位符&#34;该元素的属性,它将使用它。我没有看到为select元素设置这样一个元素的超级简单方法。我最后写了这段代码

setPlace <- function(t, p) {
    setattr <- function(x, name, nameval, attr, val) {
        if (!is.null(names(x)) && name %in% names(x) && x[[name]] == nameval) {
            x[[c("attribs",attr)]] <- val
        } else {
            if(is.list(x)) {
                oa <- attributes(x)
                x <- lapply(x, function(z) setattr(z,name, nameval, attr, val))
                attributes(x)<-oa
            }
        }
        x
    }
    setattr(t, "name", "select", "placeholder",HTML(p))
}

将获取selectInput返回的HTML并将该属性添加到元素中。然后你可以像

一样使用它
setPlace(selectInput("quotes","Select Text wrapper", 
    choices= list("None"="","Double Quotes (\")"='"', "Simple Quotes (\')"="'"), 
    selected="'"), "choose wisely")

或您布局中的类似内容。这将设置占位符属性(因为您设置了一个选定的值)可能永远不会被看到。这似乎在我的测试中起作用。