我正在努力了解如何在R Shiny中使用isolate()
和reactive()
。
我要实现以下目标:
每当单击“刷新”操作按钮时:
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$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))
关于r - R Shiny 隔离 react 数据框架,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34396403/