2015-12-21 70 views
1

我很努力地了解如何在R Shiny中使用isolate()reactive()R有光泽的隔离反应数据。框架

我要实现以下目标:

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

  • 执行上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) 
    }) 
} 

回答

3

如何像

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)) 
+0

是的,点击按钮时触发''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() 
    }) 

而在你的用户界面你应该有这样的:

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

看着闪亮:: eventReactive:

使用eventReactive创建一个计算值,只有在 响应事件更新。这与正常的反应式表达式 类似,只是它忽略了来自其反应性依赖关系的所有常见失效;它只会响应给定的 事件而失效。