闪亮的应用程序不更新隐藏的滑块
Posted
技术标签:
【中文标题】闪亮的应用程序不更新隐藏的滑块【英文标题】:Shiny App not updating hidden sliders 【发布时间】:2015-09-08 03:43:22 【问题描述】:我目前有一个基本的 R Shiny 应用程序,它由几个滑块组成,它们的值在表格中输出。该表使用如下方式呈现:
output$profile<-renderTable(
data.table(Name=userNames[input$userC,Name],
Value=input$FirstSlider,
# More data here
)
)
我还有三个“预设”按钮,单击时可将滑块的值更改为三个预设之一:
observe(
if(input$Preset==1)
updateSliderInput(session,"FirstSlider",value=1)
else if(input$Preset==2)
updateSliderInput(session,"FirstSlider",value=2)
else
updateSliderInput(session,"FirstSlider",value=3)
问题是当我使用 shinyjs::hidden
隐藏滑块时(以改进 UI),输出表没有更新。即使我将滑块放在另一个选项卡上,输出也只会在切换到该选项卡时更新。
有没有办法让 Shiny 更新滑块和输出,即使它们是隐藏的?
【问题讨论】:
【参考方案1】:这是因为闪亮的设计方式。出于性能原因,当前不可见的任何输入都不会被执行。可以查看outputOptions
函数suspendWhenHidden
参数。
【讨论】:
感谢您的回答。问题是滑块隐藏在第二个面板中,输出在主面板中,那么输出没有问题但输入问题:输入滑块没有更新,因此输出没有更新。 .. 实际上我认为输入仍然应该更新,无论它们在哪里,只有输出不会被渲染(我认为)。你能发布一个完整但简短的可重现示例吗?【参考方案2】:您可以使用一些 css 将滑块定位在窗口外。
您必须将 sliderInput
包装在 div 标记中并为其指定此样式:
#tohide
left: 999999px;
position: absolute;
使用 css 演示 Shiny:
library(shiny)
library(DT)
library(data.table)
css <- "
#tohide
left: -999999px;
position: absolute;
"
ui <- fluidPage(
tags$head(tags$style(css)),
sliderInput("Preset", label = "Preset", 1, 6, 1, 1),
tags$div(id="tohide",
sliderInput("FirstSlider",
label = "FirstSlider", 1, 3, 1, 1)
),
tableOutput("profile")
)
server <- function(input, output, session)
output$profile<-renderTable(
data.table(Name="a",
Value=input$FirstSlider
)
)
observe(
if(input$Preset==1)
updateSliderInput(session,"FirstSlider",value=1)
else if(input$Preset==2)
updateSliderInput(session,"FirstSlider",value=2)
else
updateSliderInput(session,"FirstSlider",value=3)
)
shinyApp(ui, server)
但它也应该与shinjys::hidden
一起使用,您可以在下一个演示中看到。
带有 shinjys 的闪亮演示:
library(shiny)
library(DT)
library(data.table)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
tags$head(tags$style(css)),
sliderInput("Preset", label = "Preset", 1, 6, 1, 1),
shinyjs::hidden(sliderInput("FirstSlider",
label = "FirstSlider", 1, 3, 1, 1)),
tableOutput("profile")
)
server <- function(input, output, session)
output$profile<-renderTable(
data.table(Name="a",
Value=input$FirstSlider
)
)
observe(
if(input$Preset==1)
updateSliderInput(session,"FirstSlider",value=1)
else if(input$Preset==2)
updateSliderInput(session,"FirstSlider",value=2)
else
updateSliderInput(session,"FirstSlider",value=3)
)
shinyApp(ui, server)
【讨论】:
以上是关于闪亮的应用程序不更新隐藏的滑块的主要内容,如果未能解决你的问题,请参考以下文章