首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R shiny:切换选项卡面板()时slickROutput消失

R shiny:切换选项卡面板()时slickROutput消失
EN

Stack Overflow用户
提问于 2021-01-22 17:42:33
回答 1查看 89关注 0票数 2

我正在制作一个嵌入了tabPanelsnavbarPage中的Shiny应用程序。在每个tabPanel中,我生成一系列图像。当从一个面板切换到另一个面板时,其中一个面板中加载的图像将消失。

我必须手动“刷新”页面才能再次看到它。这个问题看起来和发布here的那个类似,但我不能真的将我的tabPanels子集,即使我给了他们$idvalue

下面是一个可重复使用的示例:

代码语言:javascript
复制
library(shiny)
library(shinythemes)
library(slickR)

## ui ----

# Image list
imgs <- list(
    stackoverflow =
        "https://upload.wikimedia.org/wikipedia/fr/9/95/Stack_Overflow_website_logo.png",
    stackexchange =
        "https://upload.wikimedia.org/wikipedia/commons/6/6f/Stack_Exchange_Logo.png"
)

ui <- navbarPage(title = div(
    HTML('<span style="font-size:180%;color:white;font-weight:bold;"> Navbarpage</span></a>'),
    tags$style(style = 'position:absolute; right:42px;'),
    tags$style(HTML("#panel1{font-size: 25px}")),
    tags$style(HTML("#panel2{font-size: 25px}")),
    tags$style(HTML("#panel_about{font-size: 25px}"))
),
theme = shinytheme("flatly"),
windowTitle = "Navbarpage",
id = "navbar",

## First tabpanel ----
tabPanel(h1(id = "panel1", "Panel 1"), value = 1, fluid = TRUE,
         fluidRow(column(4,
                         selectInput("img_list", "Image list",
                                     choices = imgs,
                                     selected = imgs[1])),
                  column(8,
                         slickROutput("plot_panel1"))),
),
tabPanel(h1(id = "panel2", "Panel 2"), value = 2, fluid = TRUE,
         fluidRow(column(4,
                         selectInput("img_list", "Image list",
                                     choices = imgs,
                                     selected = imgs[1])),
                  column(8,
                         slickROutput("plot_panel2"))),
)
) # closes navbarpage

## server ----
server <- function(input, output, session){

    observe({
        output$plot_panel1 <- renderSlickR({
            slick1 <- slick_list(slick_div(
                input$img_list,
                css = htmltools::css(width = "100%", margin.left = "auto",
                                     margin.right = "auto"),
                type = "img", links = NULL))
            slickR(slick1)
        })
    })
    
    observe({
        output$plot_panel2 <- renderSlickR({
            slick2 <- slick_list(slick_div(
                input$img_list,
                css = htmltools::css(width = "100%", margin.left = "auto",
                                     margin.right = "auto"),
                type = "img", links = NULL))
            slickR(slick2)
        })
    })
}

shinyApp(ui, server)

以及它产生的结果:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-22 21:55:27

当要呈现多个slickR对象时,需要为每个对象使用唯一的slideId。此外,您不应该将render*函数包装在observe中,并对两个id使用相同的selectInput

请检查以下各项:

代码语言:javascript
复制
library(shiny)
library(shinythemes)
library(slickR)

## ui ----

# Image list
imgs <- list(
  stackoverflow =
    "https://upload.wikimedia.org/wikipedia/fr/9/95/Stack_Overflow_website_logo.png",
  stackexchange =
    "https://upload.wikimedia.org/wikipedia/commons/6/6f/Stack_Exchange_Logo.png"
)

ui <- navbarPage(title = div(
  HTML('<span style="font-size:180%;color:white;font-weight:bold;"> Navbarpage</span></a>'),
  tags$style(style = 'position:absolute; right:42px;'),
  tags$style(HTML("#panel1{font-size: 25px}")),
  tags$style(HTML("#panel2{font-size: 25px}")),
  tags$style(HTML("#panel_about{font-size: 25px}"))
),
theme = shinytheme("flatly"),
windowTitle = "Navbarpage",
id = "navbar",

## First tabpanel ----
tabPanel(h1(id = "panel1", "Panel 1"), value = 1, fluid = TRUE,
         fluidRow(column(4,
                         selectInput("img_list1", "Image list",
                                     choices = imgs,
                                     selected = imgs[1])),
                  column(8,
                         slickROutput("plot_panel1"))),
),
tabPanel(h1(id = "panel2", "Panel 2"), value = 2, fluid = TRUE,
         fluidRow(column(4,
                         selectInput("img_list2", "Image list",
                                     choices = imgs,
                                     selected = imgs[1])),
                  column(8,
                         slickROutput("plot_panel2"))),
)
) # closes navbarpage

## server ----
server <- function(input, output, session){
  
    output$plot_panel1 <- renderSlickR({
      slick1 <- slick_list(slick_div(
        input$img_list1,
        css = htmltools::css(width = "100%", margin.left = "auto",
                             margin.right = "auto"),
        type = "img", links = NULL))
      slickR(slick1, slideId = "slide1")
    })
  
    output$plot_panel2 <- renderSlickR({
      slick2 <- slick_list(slick_div(
        input$img_list2,
        css = htmltools::css(width = "100%", margin.left = "auto",
                             margin.right = "auto"),
        type = "img", links = NULL))
      slickR(slick2, slideId = "slide2")
    })
}

shinyApp(ui, server)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65842717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档