2015-01-14 4 views
6

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

Простой пример ниже иллюстрирует то, к чему я стремлюсь. Он почти работает, за исключением одного финального обновления, когда флажок «Автоматическое обновление» -checkbox не установлен, что является болью, если должна быть открыта вычислительная интенсивная вкладка. Есть ли способ обойти это?

ui.r

library(shiny) 
shinyUI(fluidPage(
    titlePanel("Test"), 
    sidebarLayout(
     sidebarPanel(
      checkboxInput("autoRefresh", "Automatically refresh", TRUE), 
      actionButton("refresh", "Refresh!"), 
      radioButtons("choice", "Choice of value:", 
       c("10" = 10, 
       "20" = 20)) 
      ), 

     mainPanel(
      tabsetPanel(type = "tabs", 
       tabPanel("Add random decimals to value", textOutput("value")) 
      ) 
     ) 
    ) 
)) 

server.r

library(shiny) 
shinyServer(function(input, output) { 
    output$value <- renderText({ 

     input$refresh 
     if(input$autoRefresh == 1) { 
      input$choice 
     } 
     isolate({ 
      output <- runif(1,0,1) + as.numeric(input$choice) 
     }) 
    }) 
}) 

Большое спасибо заранее!

ответ

2

В этом решении, я сделал два наблюдателя: один для того, когда кнопка refresh ударил и второй, когда choice изменяется. Первый всегда обновляет вывод.

Вторая проверяет состояние input$autoRefresh, а затем либо просто выдает, либо обновляет renderText.

К сожалению, вы должны иметь команду runif, написанную дважды, что может быть плохой для обновления вашего кода (проще ввести ошибки, если вы что-то делаете дважды). На практике вам может понадобиться создать новую функцию, а затем просто вызвать эту функцию, если это сложный/многострочный процесс в вашем реальном приложении.

shinyServer(function(input, output) { 
    observe({ 
     input$refresh 
     output$value<-renderText({ 
     isolate(runif(1,0,1) + as.numeric(input$choice)) 
     }) 
     }) 
    observe({ 
     input$choice 
     output$value<-if(input$autoRefresh==0) return() else { 
      renderText({isolate(runif(1,0,1) + as.numeric(input$choice))}) 
     } 
    }) 
    }) 
+0

опечатка: Refesh. Что еще более важно, это не работает. Он обновляется, когда флажок не установлен. Это связано с тем, что он не работает так, как вы его объясняете ... инструкция «if» не вводится до тех пор, пока изменение входного параметра $ select не приведет к выполнению всего блока renderText(). – hedgedandlevered

+0

@hedgedandlevered Спасибо! обновил ответ. –

+0

Этот код теперь работает. –

2

Вы можете кэшировать вывод и ярлыка вернуть его в случае необходимости

library(shiny) 
shinyServer(function(input, output) { 
    output$value <- renderText({ 

    input$refresh 
    if(input$autoRefresh == 1) { 
     input$choice 
    } else return(cachedOutput) 
    isolate({ 
     cachedOutput <<- output <- runif(1,0,1) + as.numeric(input$choice) 
    }) 
    }) 
}) 
+0

Хорошая идея! Однако, с приведенным выше кодом, ручное обновление не работает, так как cachedOutput всегда возвращается, если вводится $ autoRefresh == 0. – mholopai

+0

Я понял, что кэширование может быть полезно в другой части моего приложения, где иногда только часть таблицы требует пересчета , Это пригодится, спасибо! – mholopai

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