#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», и заменить его на сервере на «». Или, если есть способ, я не могу его найти. Извини, чувак.