4

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

4

2 回答 2

3

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

于 2015-06-24T16:04:43.053 回答
0

您可以使用一些 css 将滑块定位在窗口外。您必须将其包装sliderInput在一个 div 标记中并将此样式分配给它:

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

使用 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)
于 2018-11-15T22:14:48.467 回答