闪亮的reactiveUI重新加载时重置值

时间:2014-09-17 15:23:39

标签: r shiny

可以在闪亮中使用reactiveUI接口来选择性地显示仅在特定时间相关的输入变量。下面是一个带变量“a”的示例,它取决于值,使接口显示变量“c”或“d”:

ui.R

shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("a","choose selection",list("c","d")),
        uiOutput("b")),
      mainPanel(verbatimTextOutput("text"))
    )))

server.R

choice_list <- list(
  "c" = selectInput("c", "first set of choices", choices = list("cat","dog","house")),
  "d" = selectInput("d", "second set of choices", choices = list("money","power","fame")))
shinyServer(function(input, output) {
  output$b <- renderUI({
    choice_list[input$a]
  })  
  output$text <- renderText(paste0(input$c,input$d))
})

所以这很好用,你可以根据上下文看到你可以选择不同的项目。我的问题是,每次切换a时,您切换到的值(cd)都会重置为默认值。这不是一个问题,一次只显示一个输入,但是如果你想象一次显示许多不同的输入参数,每次切换它们都会重置它们会非常糟糕。有没有办法存储以前的值,以便在闪亮重新加载UI时它们不会重置?

只是为了更详细一点,这只是我用更大的代码集做的事情的一个例子。我有不同的用户可以运行的分析,每个分析都有自己的输入对象列表。但是它们也有很大的重叠 - 一个列表中的输入对象很多都显示在另一个列表中。目前,每当您在要进行的分析之间切换时,整个输入集都会重置,这对用户来说非常烦人。

每个分析都有一些用于运行的代码,还有一个要使用的UI对象列表。这些对象位于不同的文件中,类似于choice_listshinyServer函数之外的方式。

1 个答案:

答案 0 :(得分:1)

这是一种方式。在这里,我将当前选择存储为全局变量,将selectInput调用存储为表达式,我每次input$a更改时都会重新评估。

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("a","choose selection",list("c","d")),
        uiOutput("b")),
      mainPanel(verbatimTextOutput("text"))
    ))

c.selected <- 'cat'
d.selected <- 'money'

choice_list <- list(
  "c" = quote(selectInput("c", "first set of choices", choices = list("cat","dog","house"), selected=c.selected)),
  "d" = quote(selectInput("d", "second set of choices", choices = list("money","power","fame"), selected=d.selected))
  )

server <- function(input, output) {
  output$b <- renderUI({
    eval(choice_list[[input$a]])
  })  

  observe({
    c.selected <<- input$c
  })

  observe({
    d.selected <<- input$d
  })


  output$text <- renderText(paste0(input$c,input$d))
}

runApp(list(ui=ui, server=server))