我正在努力了解如何在R Shiny中使用isolate()reactive()

我要实现以下目标:

每当单击“刷新”操作按钮时:

  • 在data.frame和
  • 上执行subset
  • 将其输入到我的函数中以重新计算值。

  • 该子集取决于用户已选中的一组复选框,其中大约有40个。我不能让这些复选框“完全响应”,因为该功能大约需要1.5秒才能执行。相反,我想让用户有机会选择多个框,然后才单击按钮以(a)子集,然后(b)再次调用该函数。

    为此,我将data.frame加载到server.R函数中:
    df1 <- readRDS("D:/././df1.RData")
    

    然后,我有了主要的ShinyServer函数:
    shinyServer(function(input, output) {
    
      data_output <- reactive({
        df1 <- df1[,df1$Students %in% input$students_selected]
    
        #Here I want to isolate the "students_selected" so that this is only
        #executed once the button is clicked
      })
    
      output$SAT <- renderTable({
        myFunction(df1)
      })
    }
    

    最佳答案

    怎么样

    data_output <- eventReactive(input$button, {
        df1[,df1$Students %in% input$students_selected]
    })
    

    这是我的最小示例。
    library(shiny)
    ui <- list(sliderInput("num", "rowUpto", min= 1, max = 10, value = 5),
               actionButton("btn", "update"),
               tableOutput("tbl"))
    server <- function(input, output) {
      data_output <- eventReactive(input$btn, {
        data.frame(id = 1:10, x = 11:20)[seq(input$num), ]
      })
    
      output$tbl <- renderTable({
        data_output()})
    }
    
    runApp(list(ui = ui, server = server))
    

    编辑

    另一个实现,更加简洁。
    默认情况下,renderTable检查函数中所有反应式元素的更改(在这种情况下为input$numinput$button)。
    但是,您希望它仅对按钮做出反应。因此,您需要将要忽略的元素放在isolate函数中。
    如果您省略isolate函数,则在移动滑块后立即更新表。
    library(shiny)
    ui <- list(sliderInput("num", "rowUpto", min= 1, max = 10, value = 5),
               actionButton("btn", "update"),
               tableOutput("tbl"))
    server <- function(input, output) {
      output$tbl <- renderTable({
        input$btn
        data.frame(id = 1:10, x = 11:20)[seq(isolate(input$num)), ]
      })
    }
    
    runApp(list(ui = ui, server = server))
    

    关于r - R Shiny 隔离 react 数据框架,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34396403/

    10-12 14:04