Shiny UI元素的反应性顺序

时间:2016-10-15 15:38:28

标签: r shiny

使用操作按钮,我想将一些预设值加载到我闪亮的应用程序的UI元素中,然后触发更新的UI的输出。在下面的应用程序中有两个按钮。 Print会将输入$ txt中的任何内容打印到输出中。 preset按钮应使用预设值更新UI元素,然后将此值打印到输出。所需功能相当于按preset后跟print

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      textInput('txt','Text',value = ''),
      actionButton('print','Print'),
      actionButton('preset','preset')
    ),
    mainPanel(
      verbatimTextOutput("outText")
    )))

server <- function(input, output,session) {

  values <- reactiveValues(text='')

  observeEvent(input$print,{
    values$text <- input$txt
  })
  observeEvent(input$preset,{
    presetVal <-'Some preset value'
    session$sendInputMessage('txt', list(value = presetVal))
  })

  output$outText <- renderPrint({
    print(values$text)
  })

}

shinyApp(ui, server) 

那么为什么不这样做?

  observeEvent(input$preset,{
    presetVal <-'Some preset value'
    session$sendInputMessage('txt', list(value = presetVal))
    values$text <- presetVal
  })

我的应用程序有很多动态UI元素和模块化过滤器,其结果是在输出中使用的过滤数据帧。因此,为了获得正确的过滤数据框,需要在创建输出之前刷新UI元素本身。如果这是有道理的。那么是否可以模仿按preset后跟print

的操作

1 个答案:

答案 0 :(得分:0)

据我所知,如果你让所有UI元素都依赖于输入$ preset,那么一旦按下preset,它们就会刷新。

库(有光泽)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      textInput('txt','Text',value = ''),
      actionButton('print','Print'),
      actionButton('preset','preset'),
      uiOutput('myOutput')
    ),
    mainPanel(
      verbatimTextOutput("outText")
    )))

server <- function(input, output,session) {

  # default counter just for demonstration of dependency on preset button
  default <<- 0

  output$myOutput <- renderUI({

    input$preset # to introduce dependency on preset button

    default <<- default + 1

    textInput('myText', '', value = default)
  })

  values <- reactiveValues(text='')

  observeEvent(input$print,{
    values$text <- input$txt
  })
  observeEvent(input$preset,{
    presetVal <-'Some preset value'
    session$sendInputMessage('txt', list(value = presetVal))
    values$text <- presetVal
  })

  output$outText <- renderPrint({
    print(values$text)
  })

}

shinyApp(ui, server)