闪亮的应用程序不更新隐藏的滑块

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)

【讨论】:

以上是关于闪亮的应用程序不更新隐藏的滑块的主要内容,如果未能解决你的问题,请参考以下文章

如何更新此闪亮仪表板上的滑块输入?

闪亮的条件面板绕过多个相关的滑块

在ggplot中使用过滤器时闪亮的范围滑块错误

JavaFX:隐藏SplitPane的滑块/分隔线

如何将多个输入(旋钮)添加到单个滑块?

滑块动画时更新标签上的滑块值