Пустая цепочка не отображается в качестве выбора в selectInput в блестящем приложении

Я хочу, чтобы пользователь приложения выбирал текстовые оболочки для некоторых файлов, которые он должен загрузить. Доступны следующие варианты: Без оболочки, Двойные кавычки и Простые кавычки, поэтому я хочу 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 ответ

ОБНОВЛЕНИЕ: При рассмотрении изменений в коде, внесенных в selectize.js, чтобы опции без значений не использовались в качестве текста заполнителя, ( здесь) выясняется, что параметр без значения имеет приоритет над явным тегом "заполнителя". Таким образом, в текущей версии библиотеки (0.10.1), похоже, нет способа сделать это.

Таким образом, похоже, что люди selectize.js решили, что любые параметры со строкой нулевой длины в качестве значения будут использоваться в качестве заполнителя текста и не будут перечислены во входных данных. (См. Это). Это соответствует спецификации html5 для этого элемента. Альтернатива состоит в том, что если вы установите атрибут placeholder для элемента, он будет использовать его вместо этого. Я не видел супер простой способ установить такой элемент для элемента 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))
}

который возьмет HTML, возвращенный selectInput, и добавит атрибут в элемент. Тогда вы можете использовать его как

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

или что-то подобное в вашем макете. Это установит атрибут placeholder, который (поскольку вы устанавливаете выбранное значение), вероятно, никогда не будет виден. Это, похоже, сработало в моих тестах.

Другие вопросы по тегам