2017-01-27 3 views
2

У меня есть блестящее приложение, в котором изменения selectInputs запускают оба обновления для других выбирает И запускают обновление сюжета. Есть ситуации, к сожалению, когда изменение выбора вызывает сюжет для повторного рисования, тогда он обновляет другой выбор, и сюжет рисует второй раз. Поэтому я получаю многократное повторное рисование. Мое блестящее приложение более сложное, чем одно, но я переусердствовал.Предотвращение двойного розыгрыша в блестящем приложении при выборе смены

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

Есть ли способ разрешить кратковременную задержку, возможно, для блестящей, чтобы «догнать» и не заставить оба реактора вызвать заговор? Или, возможно, есть другие варианты?

library(shiny) 
server <- function(input, output, session) { 
    output$plot <- renderPlot({ 
     Sys.sleep(0.2) 
     plot(1:10, main=input$title) 
     rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = sample(colors() ,1)) 
    }) 

    observeEvent(input$country, { 
    vals <- switch(input$country, 
        US = 2001:2003, 
        UK = 2001:2005, 
        FR = 2002:2006) 

    updateSelectInput(session, "year", choices = vals, selected = vals[1]) 
    }) 

    observeEvent(c(input$country, input$year), { 

    updateNumericInput(session, "title", 
         value = paste(input$country, input$year)) 
    }) 

} 

ui <- fluidPage(

    tags$div(class="panel-body", 

      selectInput("country", "country", choices = c("US", "UK", "FR"), selected = "US"), 
      textInput("title", "Give a title", "This is my initital title"), 
      selectInput("year", "year", choices = NULL, selected = NULL) 

), 

    plotOutput("plot") 

) 

shinyApp(ui = ui, server = server) 
+0

Смотрите мой ответ здесь: http://stackoverflow.com/questions/33806811/shiny-evaluates-twice/33842753#33842753 – BigDataScientist

+0

изолят не работает в этом контексте, потому что я хотите, чтобы в некоторых случаях реактор вызывал ответ. – ZRoss

ответ

1

Из того, что я вижу в данном конкретном случае это может быть достаточно, чтобы изменить «название» наблюдатель:

observeEvent(input$year, { 

      updateNumericInput(session, "title", 
           value = paste(input$country, input$year)) 
    }) 

, поскольку каждое изменение входного $ страны вызовет обновление ввода $ год удаления input $ country от наблюдателя «title» следует избегать двойного построения графика. Я тестировал его локально, и он работает.

Позвольте мне знать, что это хорошая проблема, чтобы решить ...

!!! ПРИМЕЧАНИЕ. В ответе есть ошибка. Он не работает, если страна изменилась, но год не изменился. Я переработан код:

library(shiny) 
    server <- function(input, output, session) { 
      rv <- reactiveValues(trigger = FALSE) 
      output$plot <- renderPlot({ 
        Sys.sleep(0.2) 
        plot(1:10, main=input$title) 
        rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col = sample(colors() ,1)) 
      }) 

      observeEvent(input$country, { 
        vals <- switch(input$country, 
            US = 2001:2003, 
            UK = 2001:2005, 
            FR = 2002:2006) 
        rv$trigger = input$year == vals[1] 
        updateSelectInput(session, "year", choices = vals, selected = vals[1]) 
      }) 

      observeEvent(c(input$year, rv$trigger), { 

        updateNumericInput(session, "title", 
             value = paste(input$country, input$year)) 
        if(rv$trigger == TRUE) { 
          rv$trigger = FALSE 
        } 
      }) 

    } 

    ui <- fluidPage(

      tags$div(class="panel-body", 

        selectInput("country", "country", choices = c("US", "UK", "FR"), selected = "US"), 
        textInput("title", "Give a title", "US 2001"), 
        selectInput("year", "year", choices = 2001:2003, selected = 2001) 

      ), 

      plotOutput("plot") 

    ) 

    shinyApp(ui = ui, server = server) 
+0

Мне нравится этот ответ, вы в основном заставляете реакции на один вход - год, чтобы страна не привела непосредственно к запуску обновления сюжета. (Нагрузка приложения остается вдвойне - если у вас есть предложения для этого, дайте мне знать). – ZRoss

+0

Рад, что вам понравилось! Если инициализация года и заголовка с настройками по умолчанию приемлема, то избегается двойная ничья при загрузке приложения. Я изменил ответ. –

+0

Отлично! Благодаря.. – ZRoss

Смежные вопросы