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