【问题标题】: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 更新滑块和输出,即使它们是隐藏的?

【问题讨论】:

    标签: r shiny shinyjs


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-21
      • 2017-12-05
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      相关资源
      最近更新 更多