【问题标题】:Wrap a reactive UI in an action button RShiny将反应式 UI 包装在操作按钮中 RShiny
【发布时间】:2017-06-28 05:22:38
【问题描述】:

我有一个选项卡式 UI,每当用户选择数据表中的行时就会显示(在下面的代码中,输出是随机的,在现实生活中计算非常复杂)。

我想将显示的选项卡式 UI 设置为单击按钮。目前,每次您选择额外的行时,它都会对已选择的行重新进行计算。当用户完成选择他想要查看的所有行时,我想将其限制为一次性计算。

library(shiny)
library(DT)

用户界面:表格、操作按钮和选项卡部分。

ui <- fluidPage(
  mainPanel(
    fluidRow(
      column(12,DT::dataTableOutput(outputId = 'tableCurrencies'))
    ),
    actionButton(inputId = 'showSelectedButton',label = 'Show Selec'),
    fluidRow(
      uiOutput("myTabUI")
    )
  )
)

server 函数:如果我删除 output$myTabUI &lt;- eventReactive(input$launchCalcButton, { 部分,而是直接执行 output$myTabUI &lt;- renderUI ({ ...,它会按预期工作(当然减去点击按钮后的计算)。

server <- function(input,output){

  output$tableCurrencies <- DT::renderDataTable({datatable(data.frame(a=rnorm(10),b=rnorm(10),c=rnorm(10)))})

  origTable_selected <- reactive({
    ids <- input$tableCurrencies_rows_selected
    return(ids)
  })

  output$myTabUI <- eventReactive(input$launchCalcButton, {
      selectedTabs <- renderUI({
        myTabs <- lapply(origTable_selected(),function(i) {


          tabName <- paste0("test",i)

          a <- renderPlot({
            hist(rnorm(50))
          })
          output[[paste0(tabName,"rates")]] <- a
          return(tabPanel(
            tabName,
            fluidRow(
              column(6,plotOutput(paste0(tabName,"rates")))
            )
          ))
        })
        return(do.call(tabsetPanel,myTabs))
      })
      selectedTabs
    })
}
app = shinyApp(ui,server)
runApp(app,port=3250,host='0.0.0.0')

不知道如何解决这个问题。欢迎任何帮助。

【问题讨论】:

  • 请不要发布具有非本机端口/主机配置的应用程序。这会分散实际问题的注意力,并且可能会弄乱防火墙设置(就像对我一样)
  • 注明。感谢您的提醒

标签: r tabs reactive-programming shiny


【解决方案1】:

你可以使用isolate() 来限制响应式依赖

library(shiny)
library(DT)

ui <- fluidPage(
  mainPanel(
    fluidRow(
      column(12,DT::dataTableOutput(outputId = 'tableCurrencies'))
    ),
    actionButton(inputId = 'showSelectedButton',label = 'Show Selec'),
    fluidRow(uiOutput("myTabUI"))
  )
)

server <- function(input,output){
  output$tableCurrencies <- DT::renderDataTable({
    data.frame(a=rnorm(10),b=rnorm(10),c=rnorm(10))})     
  origTable_selected <- reactive({
    input$tableCurrencies_rows_selected        
  })      
  output$myTabUI <- renderUI({
    input$showSelectedButton
    myTabs <- lapply(isolate(origTable_selected()),function(i) {          
      tabName <- paste0("test",i)          
      a <- renderPlot({hist(rnorm(50))})
      output[[paste0(tabName,"rates")]] <- a
      return(tabPanel(
        tabName,
        fluidRow(column(6,plotOutput(paste0(tabName,"rates"))))
      ))
    })
    do.call(tabsetPanel,myTabs)
  })
}

shinyApp(ui,server)

【讨论】:

    猜你喜欢
    • 2021-01-06
    • 1970-01-01
    • 2019-05-02
    • 2017-11-13
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2017-12-22
    相关资源
    最近更新 更多