0

我在 Shiny 框架中阅读了有关动态 ui 的所有线程,但我没有找到任何有用的东西。我想显示一个推特时间线。这段代码工作得很好:

library(shiny)
library(shinydashboard)

runApp(list(ui = fluidPage(
  tags$head(tags$script('!function(d,s,id){var js,fjs=d.getElementsByTagName(s)    [0],p=/^http:/.test(d.location)?\'http\':\'https\';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");')),
  titlePanel(""),
  sidebarLayout(
    sidebarPanel()
    , mainPanel(
      a("Tweets by Andrew Ng",
        class="twitter-timeline",
        href = "https://twitter.com/AndrewYNg"
      )
    )
  )
)
, server = function(input, output, session){

}
)
)

但是,当我尝试使其具有响应性时,我只得到了一个指向 twitter 时间线的链接:

library(shiny)
library(shinydashboard)
runApp(list(ui = fluidPage(
  tags$head(tags$script('!function(d,s,id){var js,fjs=d.getElementsByTagName(s)    [0],p=/^http:/.test(d.location)?\'http\':\'https\';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");')),
  titlePanel(""),
  sidebarLayout(
    sidebarPanel()
    , mainPanel(
      uiOutput("mytimeline")
    )
  )
)
, server = function(input, output, session){

  output$mytimeline <- renderUI({
    a("Tweets by Andrew Ng",
      class="twitter-timeline",
      href = "https://twitter.com/AndrewYNg"
    )
  })



}
)
)
4

1 回答 1

0

Twitter 脚本仅在第一次运行时才加载嵌入的内容。由于脚本在静态 UI 但时间线在动态 UI 中,因此脚本将始终在插入时间线之前运行。

Twitter 文档有一个关于此的部分:https ://dev.twitter.com/web/javascript/initialization

您可以运行twttr.widgets.load()以扫描页面以查找新添加的嵌入内容。

插入嵌入内容时执行此操作的一种方法是将其包含在脚本标记中:

library(shiny)

twitterTimeline <- function(href, ...) {
  tagList(
    tags$a(class = "twitter-timeline", href = href, ...),
    tags$script("twttr.widgets.load()")
  )
}

runApp(list(ui = fluidPage(
  tags$head(tags$script('!function(d,s,id){var js,fjs=d.getElementsByTagName(s)    [0],p=/^http:/.test(d.location)?\'http\':\'https\';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");')),
  titlePanel(""),
  sidebarLayout(
    sidebarPanel()
    , mainPanel(
      uiOutput("mytimeline")
    )
  )
)
,
server = function(input, output, session) {

  output$mytimeline <- renderUI({
    twitterTimeline("https://twitter.com/AndrewYNg", "Tweets by Andrew Ng")
  })
}
))

有关更多详细信息的类似问题,请参阅如何使用 htmlOutput 在 R Shiny 应用程序中启用语法突出显示

于 2018-01-09T03:12:35.083 回答