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

#r #shiny #selectize.js

#r #блестящий #selectize.js

Вопрос:

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

Заранее спасибо!

Комментарии:

1. Делает ли «None» = «»»» то, что вы хотите?

2. Я хочу символ длиной 0, поэтому «»»» не работает (в нем есть два символа двойных кавычек). nchar("") = 0, nchar("""") = 2

Ответ №1:

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

Таким образом, это выглядит как selectize.js люди решили, что любые параметры со строкой нулевой длины в качестве значения будут использоваться в качестве текста-заполнителя и не будут перечислены во входных данных. (Смотрите это). Это согласуется со спецификацией html5 для этого элемента. Альтернативой является то, что если вы установите атрибут «заполнитель» для элемента, он будет использовать его вместо этого. Я не видел супер простого способа установить такой элемент для элемента select. В итоге я написал этот код

 setPlace <- function(t, p) {
    setattr <- function(x, name, nameval, attr, val) {
        if (!is.null(names(x)) amp;amp; name %in% names(x) amp;amp; 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, который (поскольку вы установили выбранное значение), вероятно, никогда не будет отображаться. Похоже, это сработало в моих тестах.

Комментарии:

1. Я не уверен, что делает заполнитель в метке выбора. Я попробовал ваше предложение, и я получаю тот же результат, что и при установке selectize=FALSE в функции selectInput , то есть у меня есть None опция, но внешний вид отличается от выбора.

2. @Rufo Какая версия shiny пакета у вас установлена? Я тестировал с 0.10.0.

3. Произошли довольно странные вещи. Моя версия была 0.9.1, поэтому я обновил ее до 0.10.0. Ваше исправление по-прежнему выглядит selectize=FALSE как с тремя доступными вариантами, но в моем исходном примере теперь нет ни None одного варианта, а не Double Quotes (") варианта.

4. Кстати, я пробовал это в Linux Ubuntu с R версии 3.1.0 и shiny версии 0.9.1 (возникли проблемы с ее обновлением в Ubuntu) и в Windows с R версии 3.0.2 и обеими версиями shiny, на всякий случай, если это актуальная информация.

5. @Rufo У меня действительно была ошибка в моем коде. Я думал selectInput , что возвращал строку, но на самом деле она возвращала объект. Я обновил свой код, но он все равно не будет работать. selectize.js библиотека просто не имеет возможности разрешить параметр с пустым значением в списке. Лучшее, что вы можете сделать, это использовать некоторое значение, например «none», и заменить его на сервере на «». Или, если есть способ, я не могу его найти. Извини, чувак.