Почему toggleState не работает с modalDialog в R Shiny? - PullRequest
0 голосов
/ 02 февраля 2019

Когда я использую sparkljs :: togglestate, чтобы сравнить все входные переменные из пользовательского интерфейса с входными переменными modalDialog, это работает только в первый раз.Если я закрою модальное диалоговое окно и открою его снова, оно не будет работать!

Реактивное правило:

if they are equal: button is blocked
if they are different: the button is enabled

Obs: значения из модальных диалоговых переменных должны быть выбранными входными значениямив пользовательском интерфейсе.(Это очень общий пример, если у вас есть проверка базы данных, и вы просто хотите обновить ее, если что-то изменилось)

Я создал это простое приложение, чтобы представить проблему.Просто запустите его, нажмите кнопку один раз, наблюдайте ожидаемое поведение, закройте модальное диалоговое окно, щелкните второй раз и посмотрите, что оно больше не работает, но если вы измените какое-либо значение в модальном диалоговом окне и вернетесь к исходному входному значению, оно внезапно«вспоминает» снова работать.

library(shiny)
library(shinyjs)

shinyApp(
  ui =
    fluidPage(
      useShinyjs(),
      sidebarLayout(
        sidebarPanel(
                     textInput("txt1","text"),
                     selectInput("select1","select",c("A","B","C")),
                     numericInput("n1","numeric",1),
                     dateInput("d1","date",value = Sys.Date()),

                     actionButton("go", "Go")),
      mainPanel())
    ),

  server =
    function(input, output, session) {


      observe({
        shinyjs::toggleState("click", !(input$txt1    == input$txt2 &&
                                        input$select1 == input$select2 &&
                                        input$n1      == input$n2 &&
                                        input$d1      == input$d2  
                                        ) )
        })

observeEvent(input$go,{
  showModal(
    modalDialog(
      textInput("txt2", "text", input$txt1),
      selectInput("select2", "select", c("A","B","C"), input$select1),
      numericInput("n2", "numeric", input$n1 ),
      dateInput("d2", "date", value = input$d1),

      actionButton("click", "Click")
    )
  )

})


    }
)

Почему такое неожиданное поведение?Есть ли обходной путь для этого?

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

1 Ответ

0 голосов
/ 04 февраля 2019

Проблема в вашем коде состоит в том, что observe оценивается только при создании входов, а затем при изменении входов.Вам нужно будет оценивать свое состояние переключателя каждый раз, когда вы нажимаете на кнопку go.Поэтому вам нужно будет использовать observeEvent в дополнение к observe.Измененный код сервера будет выглядеть следующим образом:

server =
function(input, output, session) {

  observe({
    shinyjs::toggleState("click", !(input$txt1    == input$txt2 &&
                                      input$select1 == input$select2 &&
                                      input$n1      == input$n2 &&
                                      input$d1      == input$d2
    ) )
  })

  observeEvent(input$go,{
    showModal(
      modalDialog(
        textInput("txt2", "text", input$txt1),
        selectInput("select2", "select", c("A","B","C"), input$select1),
        numericInput("n2", "numeric", input$n1 ),
        dateInput("d2", "date", value = input$d1),

        actionButton("click", "Click")
      )
    )

  })

  observeEvent(input$go,{
    shinyjs::toggleState("click", !(input$txt1    == input$txt2 &&
                                      input$select1 == input$select2 &&
                                      input$n1      == input$n2 &&
                                      input$d1      == input$d2
    ) )
  })


}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...