按钮对 Shiny 应用程序中 slideBar 输入的更改没有反应
Button is not reactive to changes to slideBar input in Shiny app
我试图让 shiny 在用户单击操作按钮后对滑动条值进行计算。单击操作按钮后,应用程序应显示一条消息。目前我得到了以下代码运行,但是当你第一次点击Action Button后,它会在响应式滑动条发生变化时自动重新执行。有人建议每次滑动条输入更改时都必须单击操作按钮吗?
shinyApp(
ui = fluidPage(
div(
id = "form",
sliderInput("popDensity", "What is the population density?", value=0, min=0, max=1500),
actionButton("button", "Evaluate", style="color: #fff; background-color: #337ab7; border-color: #2e6da4")
),
div(
id = "sidebar",
sidebarPanel(
uiOutput("calculation") ) )
),
server = function(input, output) {
likelihood<-reactive({(1/500)*input$popDensity})
observeEvent(input$button, {
output$calculation<-renderUI({
if (likelihood()>1) {
a <- paste("<span style=color:red> be careful! </span>")
}
else if (likelihood()>.65){
a <- paste("<span style=color:orange> be careful! </span>")
}
else if (likelihood()>.35){
a <- paste("<span style=color:yellow> be careful! </span>")
}
else if (likelihood()>.10){
a <- paste("<span style=color:blue> be careful! </span>")
}
else {
a <- paste("<span style=color:green> be careful! </span>")
}
HTML(a)
})
})
}
)
如果您希望 UI 仅在单击按钮时更新,则 likelihood
不需要反应。所以你可以把你的服务器函数写成
server = function(input, output) {
observeEvent(input$button, {
likelihood<-(1/500)*input$popDensity
output$calculation<-renderUI({
if (likelihood>1) {
a <- paste("<span style=color:red> be careful! </span>")
}
else if (likelihood>.65){
a <- paste("<span style=color:orange> be careful! </span>")
}
else if (likelihood>.35){
a <- paste("<span style=color:yellow> be careful! </span>")
}
else if (likelihood>.10){
a <- paste("<span style=color:blue> be careful! </span>")
}
else {
a <- paste("<span style=color:green> be careful! </span>")
}
HTML(a)
})
})
}
并得到你想要的效果。
或者,如果 likelihood
由于您没有解释的原因需要保持反应,那么您需要将它与对滑块的依赖隔离开来,并将对按钮的依赖引入 renderUI
称呼。两者都很容易做到。
您可以使用 isolate
:
将小部件从对输入的依赖中分离出来
likelihood<-reactive({(1/500)*isolate(input$popDensity)})
引入对按钮的依赖同样简单:只需在 renderUI
调用的任意位置添加对 input$button
的引用。这通常在调用的顶部完成:
output$calculation<-renderUI({
input$button
<your existing code here>
})
我试图让 shiny 在用户单击操作按钮后对滑动条值进行计算。单击操作按钮后,应用程序应显示一条消息。目前我得到了以下代码运行,但是当你第一次点击Action Button后,它会在响应式滑动条发生变化时自动重新执行。有人建议每次滑动条输入更改时都必须单击操作按钮吗?
shinyApp(
ui = fluidPage(
div(
id = "form",
sliderInput("popDensity", "What is the population density?", value=0, min=0, max=1500),
actionButton("button", "Evaluate", style="color: #fff; background-color: #337ab7; border-color: #2e6da4")
),
div(
id = "sidebar",
sidebarPanel(
uiOutput("calculation") ) )
),
server = function(input, output) {
likelihood<-reactive({(1/500)*input$popDensity})
observeEvent(input$button, {
output$calculation<-renderUI({
if (likelihood()>1) {
a <- paste("<span style=color:red> be careful! </span>")
}
else if (likelihood()>.65){
a <- paste("<span style=color:orange> be careful! </span>")
}
else if (likelihood()>.35){
a <- paste("<span style=color:yellow> be careful! </span>")
}
else if (likelihood()>.10){
a <- paste("<span style=color:blue> be careful! </span>")
}
else {
a <- paste("<span style=color:green> be careful! </span>")
}
HTML(a)
})
})
}
)
如果您希望 UI 仅在单击按钮时更新,则 likelihood
不需要反应。所以你可以把你的服务器函数写成
server = function(input, output) {
observeEvent(input$button, {
likelihood<-(1/500)*input$popDensity
output$calculation<-renderUI({
if (likelihood>1) {
a <- paste("<span style=color:red> be careful! </span>")
}
else if (likelihood>.65){
a <- paste("<span style=color:orange> be careful! </span>")
}
else if (likelihood>.35){
a <- paste("<span style=color:yellow> be careful! </span>")
}
else if (likelihood>.10){
a <- paste("<span style=color:blue> be careful! </span>")
}
else {
a <- paste("<span style=color:green> be careful! </span>")
}
HTML(a)
})
})
}
并得到你想要的效果。
或者,如果 likelihood
由于您没有解释的原因需要保持反应,那么您需要将它与对滑块的依赖隔离开来,并将对按钮的依赖引入 renderUI
称呼。两者都很容易做到。
您可以使用 isolate
:
likelihood<-reactive({(1/500)*isolate(input$popDensity)})
引入对按钮的依赖同样简单:只需在 renderUI
调用的任意位置添加对 input$button
的引用。这通常在调用的顶部完成:
output$calculation<-renderUI({
input$button
<your existing code here>
})