当在Shiny中使用一个evenExpr作为多处理程序时,无需触发watchEvent

时间:2019-02-09 20:42:58

标签: r shiny

我正在创建闪亮的应用程序。用于计算风险分数,用户将在其中上传输入文件并选择输入,例如种族,计算分数的类型和疾病。选择所有输入并上传文件后,我的应用程序。用户单击操作按钮时将运行,并显示图形和数据框之类的输出

我正在使用 observeEvent 来控制我的App不必要的触发(带有一个eventExpr的multple handleExpr ),这是我的简化代码版本。很抱歉,我的代码不可复制。

 observeEvent(input$action,{

    isolate(system2("bash_script/plink.sh",args = c(input$file$datapath,input$type,input$sum_stat,input$Disease,input$Ethnic,input$Ref)))

    output$table_score <- renderDataTable({
      percentile <- read.csv("../output/score_percentile.csv",header = T, sep = "\t")
    }, selection = "single")

    output$table_variant <- renderDataTable({
      varaints_in_sample <- fread("../output/summary.csv", header = T, drop = 1)
    })

    #Plot Graph
    output$plot <- renderPlot({
      s <- input$table_score_cell_clicked
      plot("../output/score_percentile_plot.csv",s,"analysis")
    })

  })

我的问题是,当我首次运行应用程序时,一切都是可控的。 但是,如果我想选择新输入。例如,我将输入疾病从心脏病变为另一种疾病。我的应用程序。尽管我没有点击操作按钮,但仍会不必要地触发该操作。

因此,有没有办法将 observeEvent 与一个evenExpr一起用于多个handleExpr

感谢大家的帮助!

1 个答案:

答案 0 :(得分:-1)

我认为,这是您问题的简化示例。解决方案是将所有input$...放在isolate()内。

library(shiny)

ui <- fluidPage(

   sidebarLayout(
      sidebarPanel(
         sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),
         actionButton('action', 'Click')
      ),

      mainPanel(
         plotOutput("distPlot")
      )
   )
)

server <- function(input, output) {

    output$distPlot <- renderPlot({
        req(input$action)
        # generate bins based on input$bins from ui.R
        x    <- faithful[, 2] 
        bins <- seq(min(x), max(x), length.out = isolate(input$bins) + 1)

        # draw the histogram with the specified number of bins
        hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })

}

shinyApp(ui = ui, server = server)