#r #shiny #shiny-reactivity #shinywidgets
Вопрос:
У меня есть блестящее приложение, которое использует knobInputs от shinywidgets. Мне нужно динамически изменять некоторые параметры на сервере. Я знаю, как изменить значение регулятора с помощью updateKnobInput, но я не понимаю, как изменить другие параметры. В частности, мне нужно установить значение только для чтения от FALSE до TRUE, когда пользователь нажимает на определенную вещь.
В документации updateKnobInput указано: «Список дополнительных параметров для обновления, используйте аргументы knobInput». К сожалению, я не понимаю, как на самом деле это закодировать
Пожалуйста, посмотрите мой пример. Когда пользователь нажимает кнопку, значение регулятора должно измениться с 50 до 15 (это работает), а кнопки только для чтения должны измениться с FALSE на TRUE (это не работает).
library(shiny)
library(shinyWidgets)
ui <- fluidPage(
knobInput("myknob", label = "My Knob", min = 0, max = 100, value = 50, readOnly = F),
actionButton("changeknob", label = "Change the knob")
)
server <- function(input, output, session) {
observeEvent(input$changeknob, {
updateKnobInput(session, "myknob", value = 15, options = list(readOnly = T))
})
}
shinyApp(ui = ui, server = server)
Большое вам спасибо за вашу помощь!
Комментарии:
1. Это похоже на ошибку.
shinyjs::disable()
не работает ни на кнопках, ни на кнопках. Вы можете подать заявку на github.com/dreamRs/shinyWidgets/issues
Ответ №1:
После изучения кода виджета мне кажется, что API глючит.
- В принципе виджет может получить изменение
readOnly
атрибута наJavaScript
стороне - Однако этот API не реализован на
R
стороне - Погружаясь еще глубже в базовый элемент jQuery Knob, мне кажется (но имейте в виду, что мой JS не настолько надежен), что
readOnly
атрибут может быть установлен только при запуске элемента.
Чтобы сделать длинную историю короткой, на мой взгляд, с текущей реализацией обоих shinyWidgets::knobInput
и самого виджета jQuery knob невозможно достичь этого так, как вы хотите.
Таким образом, вам нужен обходной путь. Вы можете повторно отобразить виджет на основе нажатия кнопки, как в этом примере:
library(shiny)
library(shinyWidgets)
ui <- fluidPage(
uiOutput("knob_container"),
actionButton("changeknob", label = "Change the knob")
)
server <- function(input, output, session) {
output$knob_container <- renderUI({
was_pressed <- input$changeknob > 0
knobInput("myknob", label = "My Knob", min = 0, max = 100,
value = ifelse(was_pressed, 15, 50), readOnly = was_pressed)
})
}
shinyApp(ui = ui, server = server)
Комментарии:
1. Большое вам спасибо за ваше расследование!
2. Добро пожаловать, если это ответ на ваш вопрос, не могли бы вы любезно принять это в качестве ответа (используя галочку в ответе)?