Пустая цепочка не отображается в качестве выбора в 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, который (поскольку вы устанавливаете выбранное значение), вероятно, никогда не будет виден. Это, похоже, сработало в моих тестах.