Shiny app中的Javascript仅加载一次

时间:2017-12-19 16:58:49

标签: shiny

编辑:找到可重现的例子的广义问题

下面的应用有两个tabPanels,每个sidebarPanel都有一些Javascript。我希望Tab 1中的Javascript能够随时运行Tab 1(即,当我最初启动应用程序时以及从Tab 2导航回Tab 1时)。此外,我希望我导航到该选项卡的任何时候都可以运行选项卡2中的Javascript。

相反,两个选项卡的Javascript在启动应用程序后立即运行,然后再也不会运行。

作为上下文,我构建了这个示例,因为我在尝试使用Javascript在我的Shiny应用程序中放置Amazon Associates广告时遇到了这个问题。

可重复的例子

library(shiny)

ui = navbarPage( "",
                  tabPanel( "Tab 1",
                            mainPanel(

                              wellPanel("Blah blah blah"), 
                              width = 6
                            ),

                            sidebarPanel(

                              # only runs once, like the ads
                              HTML('<script type="text/javascript"> alert("Tab 1 is talking"); </script>')

                              # # runs every time
                              #HTML('<b> test </b>')

                              , width=6 )
                  ),

                  tabPanel( "Tab 2",

                            mainPanel(
                              wellPanel("Blah blah blah"), 
                              width = 6

                            ),  # ends mainPanel

                            sidebarPanel(

                              # only runs once, like the ads
                              HTML('<script type="text/javascript"> alert("Tab 2 is talking"); </script>')

                              # # runs every time
                              #HTML('<b> test </b>')

                              , width=6 )

                            )

)

server <- function(input, output) {

}

app = shinyApp( ui, server )

1 个答案:

答案 0 :(得分:1)

标签仅切换页面上已有内容的可见性。因此,当应用程序启动时,Tab 2实际上已加载但隐藏了。如果您希望选项卡动态添加和删除脚本,则可以使用renderUI根据活动选项卡执行此操作。或sendCustomMessageaddCustomMessageHandler

以下是使用renderUI的示例:

library(shiny)

ui = navbarPage("", id = "navbar",
  tabPanel( "Tab 1",
           mainPanel(
             wellPanel("Blah blah blah"), 
             width = 6
           ),

           sidebarPanel(
             uiOutput("tab1"),
             width = 6
           )
  ),

  tabPanel( "Tab 2",
           mainPanel(
             wellPanel("Blah blah blah"), 
             width = 6
           ),

           sidebarPanel(
             uiOutput("tab2"),
             width=6 
           )
  )
)

server <- function(input, output) {
  output$tab1 <- renderUI({
    req(input$navbar == "Tab 1")
    HTML('<script type="text/javascript"> alert("Tab 1 is talking"); </script>')
  })

  output$tab2 <- renderUI({
    req(input$navbar == "Tab 2")
    HTML('<script type="text/javascript"> alert("Tab 2 is talking"); </script>')
  })
}

shinyApp( ui, server )