闪亮:允许用户选择反应性
Shiny: allow reactivity to be user-selectable
我正在构建一个包含多个选项卡的应用程序,其中一些涉及过多的计算,而另一些则涉及快速计算。允许用户在反应性或手动更新之间进行选择的复选框与 "refresh" 按钮结合使用将是理想的选择。
下面的简单示例说明了我的目标。它几乎可以工作,除了在未选中 "Automatically refresh"-checkbox 时进行最后一次刷新,如果打开计算密集型选项卡,这会很痛苦。有什么解决办法吗?
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)
})
})
})
非常感谢!
您可以在适当的时候缓存输出和快捷方式-return它
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
命令编写两次,这可能不利于更新您的代码(如果您执行两次操作则更容易引入错误)。在实践中,如果这是您实际应用程序中的 complex/multi-line 进程,您可能想创建一个新函数然后调用该函数。
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))})
}
})
})
我正在构建一个包含多个选项卡的应用程序,其中一些涉及过多的计算,而另一些则涉及快速计算。允许用户在反应性或手动更新之间进行选择的复选框与 "refresh" 按钮结合使用将是理想的选择。
下面的简单示例说明了我的目标。它几乎可以工作,除了在未选中 "Automatically refresh"-checkbox 时进行最后一次刷新,如果打开计算密集型选项卡,这会很痛苦。有什么解决办法吗?
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)
})
})
})
非常感谢!
您可以在适当的时候缓存输出和快捷方式-return它
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
命令编写两次,这可能不利于更新您的代码(如果您执行两次操作则更容易引入错误)。在实践中,如果这是您实际应用程序中的 complex/multi-line 进程,您可能想创建一个新函数然后调用该函数。
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))})
}
})
})