【问题标题】:R shiny isolate reactive data.frameR闪亮隔离反应data.frame
【发布时间】:2015-12-21 22:36:04
【问题描述】:

我很难理解如何在 R Shiny 中使用 isolate() 和 reactive()。

我想实现以下目标:

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

  • 在 data.frame 上执行 subset 并且,

  • 将此输入我的函数以重新计算值。

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

为此,我在 server.R 函数中加载了 data.frame:

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)
  })
}

【问题讨论】:

    标签: r shiny reactive-programming


    【解决方案1】:

    怎么样

    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$num 和 input$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))
    

    【讨论】:

    • 是的,点击按钮时会触发eventReactive。
    【解决方案2】:

    改用eventReactive:

    data_output <- eventReactive(input$updateButton, {
    
        df1 <- df1[,df1$Students %in% input$students_selected] #I think your comments are messed up here, but I'll leave the filtering formatting to you
    
      })
    
      output$SAT <- renderTable({
        data_output()
      })
    

    在你的 UI 中你应该有类似的东西:

    actionButton('updateButton',label = "Filter")
    

    查看 ?shiny::eventReactive:

    使用 eventReactive 创建一个仅在 对事件的响应。这就像一个正常的反应式表达 除了它忽略了来自它的所有通常的失效 反应性依赖;它只会在响应给定的情况下失效 事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 2019-02-15
      • 2016-07-28
      • 2020-12-18
      • 2020-03-05
      • 1970-01-01
      相关资源
      最近更新 更多