Сверкающий: Обновить ввод без срабатывания реактивов? - PullRequest
0 голосов
/ 06 февраля 2019

Есть ли возможность обновить ввод без срабатывания реактивов?

Ниже приведен минимальный пример.Цель состоит в том, чтобы обновить ползунок без изменения значения на главной панели.Когда ползунок снова изменяется, он должен быть снова передан зависимым реактивам.

Вопрос и основной вариант использования похож на следующие вопросы: R блестящий - возможная проблема с обновлением *** Ввод и реактивность и Обновление SelectInput без триггера реактивного? .Похожий на эти вопросы, в моем случае есть ответ, который зависит от двух входов.Я хочу обновить один из этих входных данных в зависимости от другого, в результате чего реактивный рассчитывается дважды.Однако оба эти вопроса обошли проблему, обновляя входные данные только выборочно.Это невозможно в моем случае использования, так как я хочу, чтобы некоторая информация была показана пользователю путем обновления ввода.

Если нет возможности обновить ввод без срабатывания реактивов, я задам дополнительный вопрос, посвященный моему варианту использования.

Пример

library(shiny)

ui <- fluidPage(
   titlePanel("Update Slider - Isolate reaction?"),

   sidebarLayout(
      sidebarPanel(
         sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),
         actionButton("set1", "set slider 'bins'$value=20"),
         actionButton("set2", "'ISOLATED' set slider 'bins'$value=20 ")
      ),

      mainPanel(
         textOutput("sliderValue")
      )
   )
)

# Define server logic 
server <- function(input, output, session) {
   output$sliderValue <- renderText(input$bins) 

   observeEvent(input$set1,{
     updateSliderInput(session,"bins",value=20)
   })
   observeEvent(input$set2,{
     ## Is there any possibility to update the slider without 'sliderValue' changing?
     #isolate does not work
     isolate(
       updateSliderInput(session,"bins",value=20 )
       )
   })
}

shinyApp(ui = ui, server = server)

1 Ответ

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

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

 # Define server logic
 server <- function(input, output, session) {
-  output$sliderValue <- renderText(input$bins)
+  output$sliderValue <- renderText({ saved_bins(); })

+  update <- reactiveVal(TRUE)
+  saved_bins <- reactiveVal(30)
+
+  observeEvent(input$bins, {
+    if (update()) saved_bins(input$bins) else update(TRUE)
+  })
   observeEvent(input$set1,{
     updateSliderInput(session,"bins",value=20)
   })
   observeEvent(input$set2,{
     ## Is there any possibility to update the slider without 'sliderValue' changing?
     #isolate does not work
+    update(FALSE)
-    isolate(
       updateSliderInput(session,"bins",value=20 )
-    )
   })
 }

Метод: использование двух новых реактивных значений, одно для хранения данных, которые (saved_bins) используются при рендеринге, и одно (update), чтобы сохранить, должны ли эти данные быть обновлены.Все, что зависит от input$bins, должно зависеть от saved_bins().При использовании дополнительного observeEvent реакционная способность будет всегда каскадироваться, как первоначально требовалось , за исключением , когда вы явно устанавливаете одноразовый «не каскадный» с добавленным update(FALSE).

Полный код ниже:

library(shiny)

ui <- fluidPage(
   titlePanel("Update Slider - Isolate reaction?"),

   sidebarLayout(
      sidebarPanel(
         sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),
         actionButton("set1", "set slider 'bins'$value=20"),
         actionButton("set2", "'ISOLATED' set slider 'bins'$value=20 ")
      ),

      mainPanel(
         textOutput("sliderValue")
      )
   )
)

# Define server logic 
server <- function(input, output, session) {
  output$sliderValue <- renderText({ saved_bins(); }) 

  update <- reactiveVal(TRUE)
  saved_bins <- reactiveVal(30)

  observeEvent(input$bins, {
    if (update()) saved_bins(input$bins) else update(TRUE)
  })
  observeEvent(input$set1,{
    updateSliderInput(session,"bins",value=20)
  })
  observeEvent(input$set2,{
    ## Is there any possibility to update the slider without 'sliderValue' changing?
    #isolate does not work
    update(FALSE)
    updateSliderInput(session,"bins",value=20)
 })
}

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