闪亮:允许反应性由用户选择

时间:2015-01-14 18:19:00

标签: r shiny

我正在构建一个包含多个标签的应用,其中一些涉及过多的计算,另一些涉及快速计算。一个允许用户在反应性或手动更新之间进行选择的复选框,与“刷新&#34”按钮相结合,将是理想的选择。

下面的简单示例说明了我的目标。它几乎可以工作,除了在未选中"自动刷新" -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 个答案:

答案 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)
    })
  })
})

答案 1 :(得分: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))})
      }  
    })
  })