Как изменить параметр knobInputs (только для чтения) в shiny с помощью updateKnobInput?

#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. Добро пожаловать, если это ответ на ваш вопрос, не могли бы вы любезно принять это в качестве ответа (используя галочку в ответе)?