2015-12-21 80 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創建一個計算值,只有在 響應事件更新。這與正常的反應式表達式 類似,只是它忽略了來自其反應性依賴關係的所有常見失效;它只會響應給定的 事件而失效。