[英]Shiny: allow reactivity to be user-selectable
我正在構建一個包含多個選項卡的應用程序,其中一些涉及過多的計算,另一些涉及快速計算。 允許用戶在反應性或手動更新之間進行選擇的復選框與“刷新”按鈕相結合將是理想的。
下面的簡單示例說明了我的目標。 它幾乎可以工作,除了在“自動刷新” - 檢查框未選中時最后一次刷新,這是一個痛苦,如果計算密集的選項卡打開。 有沒有辦法解決?
ui.r
library(shiny)
shinyUI(fluidPage(
titlePanel("Test"),
sidebarLayout(
sidebarPanel(
checkboxInput("autoRefresh", "Automatically refresh", TRUE),
actionButton("refresh", "Refresh!"),
radioButtons("choice", "Choice of value:",
c("10" = 10,
"20" = 20))
),
mainPanel(
tabsetPanel(type = "tabs",
tabPanel("Add random decimals to value", textOutput("value"))
)
)
)
))
server.r
library(shiny)
shinyServer(function(input, output) {
output$value <- renderText({
input$refresh
if(input$autoRefresh == 1) {
input$choice
}
isolate({
output <- runif(1,0,1) + as.numeric(input$choice)
})
})
})
提前謝謝了!
您可以緩存輸出並快捷方式 - 在適當的時候返回它
library(shiny)
shinyServer(function(input, output) {
output$value <- renderText({
input$refresh
if(input$autoRefresh == 1) {
input$choice
} else return(cachedOutput)
isolate({
cachedOutput <<- output <- runif(1,0,1) + as.numeric(input$choice)
})
})
})
在這個解決方案中,我創建了兩個觀察者:一個用於何時refresh
按鈕,另一個用於何時更改choice
。 第一個總是更新輸出。
第二個檢查input$autoRefresh
的狀態,然后退出或更新renderText
。
不幸的是,你必須編寫兩次runif
命令,這對於更新你的代碼是不利的(如果你做了兩次更容易引入錯誤)。 在實踐中,您可能想要創建一個新函數,然后只需調用該函數,如果這是您實際應用程序中的復雜/多行過程。
shinyServer(function(input, output) {
observe({
input$refresh
output$value<-renderText({
isolate(runif(1,0,1) + as.numeric(input$choice))
})
})
observe({
input$choice
output$value<-if(input$autoRefresh==0) return() else {
renderText({isolate(runif(1,0,1) + as.numeric(input$choice))})
}
})
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.