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

时间:2015-06-22 15:39:45

标签: r shiny shinyjs

我目前有一个基本的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更新滑块和输出,即使它们被隐藏了?

2 个答案:

答案 0 :(得分:3)

这是因为闪亮的设计方式。出于性能原因,任何当前不可见的输入都不会被执行。您可以查看outputOptions函数suspendWhenHidden参数。

答案 1 :(得分:0)

您可以使用一些CSS将滑块放置在窗口外部。 您将必须将sliderInput包装在div标签中,并为其指定以下样式:

#tohide {
  left: 999999px;
  position: absolute;
}

Demo Shiny with CSS:

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)