R twitterwidget包Shiny输入更新时旧推文未清除问题求助
问题描述
我在使用renderTwitterwidget()时,每次修改输入值,Shiny UI都会在原有推文下方新增一条新推文,旧推文不会被清除。希望每次向renderTwitterwidget传入新的twitterwidget对象时,可以实现清除旧推文、仅展示新推文的效果。
注意:该代码无法在RStudio查看器中正常渲染内容,请在浏览器中打开应用查看运行结果。
复现代码
有Twitter账号版本
# Libraries --------------------------------------------------------------- library(shiny) library(twitterwidget) library(tidyverse) library(rtweet) # UI ---------------------------------------------------------------------- ui <- fluidPage( # Input functions textInput(inputId = 'search_term', label = '搜索近6-9天的推文:', placeholder = '#covid-19', width = '90%' ), actionButton(inputId = 'submit_button', label = '提交' ), # Output functions twitterwidgetOutput('twitter', width = "100%", height = "400px") ) # Server ------------------------------------------------------------------ server <- function(input, output) { # 获取数据 tweet_id <- eventReactive(input$submit_button, {search_tweets(q = input$search_term, n = 1, lang = 'en') %>% pull(status_id)}) # Twitter组件渲染 output$twitter <- renderTwitterwidget(twitterwidget(tweet_id())) } shinyApp(ui, server)
无Twitter账号测试版本
# Libraries --------------------------------------------------------------- library(shiny) library(twitterwidget) library(tidyverse) # 推文status_id向量 --------------------------------------------- v_ids <- c("1434550715905724416", "1434404394133594112", "1434270392533889039", "1432293982541946884", "1432396306698354688", "1434187565633003526", "1433095963338551297", "1432339458309955585", "1431909314600574977","1432064144040202241", "1434268168231477248", "1431912031100227589", "1434188285103022086", "1432066801588920325", "1434184994579230720", "1434100772069908485", "1433887544274563075", "1433801716202344460", "1433799487592468492", "1433754869429592078", "1433120347176386561", "1432410673259057161", "1433115345938784263", "1433093342456389639", "1432961860731478017", "1432828362280476673", "1432812324709179394", "1432806681793159168", "1432721292403281920", "1432707208211537930", "1432700115299586053", "1432658875665289216", "1432623112747638785", "1432614035141312513", "1432612768717451266") # UI ---------------------------------------------------------------------- ui <- fluidPage( # Input functions textInput(inputId = 'search_term', label = '搜索近6-9天的推文:', placeholder = '#covid-19', width = '90%' ), actionButton(inputId = 'submit_button', label = '提交' ), # Output functions twitterwidgetOutput('twitter', width = "100%", height = "400px") ) # Server ------------------------------------------------------------------ server <- function(input, output) { # 获取数据 tweet_id <- eventReactive(input$submit_button, {sample(v_ids, 1)}) # Twitter组件渲染 output$twitter <- renderTwitterwidget(twitterwidget(tweet_id())) } shinyApp(ui, server)
解决方案
该问题是twitterwidget包自身的渲染逻辑缺陷导致:它没有遵循Shiny标准输出组件的旧内容清理规则,每次更新内容时只会往现有容器内追加新的推文iframe,不会清除之前的内容。
可以通过动态渲染输出容器的方式解决,每次触发查询时先销毁旧的输出容器,再生成新的容器渲染推文,从根源上避免内容累加。
以下是修改后的无账号测试版本代码,有账号版本可对应修改:
# Libraries --------------------------------------------------------------- library(shiny) library(twitterwidget) library(tidyverse) # 推文status_id向量 --------------------------------------------- v_ids <- c("1434550715905724416", "1434404394133594112", "1434270392533889039", "1432293982541946884", "1432396306698354688", "1434187565633003526", "1433095963338551297", "1432339458309955585", "1431909314600574977","1432064144040202241", "1434268168231477248", "1431912031100227589", "1434188285103022086", "1432066801588920325", "1434184994579230720", "1434100772069908485", "1433887544274563075", "1433801716202344460", "1433799487592468492", "1433754869429592078", "1433120347176386561", "1432410673259057161", "1433115345938784263", "1433093342456389639", "1432961860731478017", "1432828362280476673", "1432812324709179394", "1432806681793159168", "1432721292403281920", "1432707208211537930", "1432700115299586053", "1432658875665289216", "1432623112747638785", "1432614035141312513", "1432612768717451266") # UI ---------------------------------------------------------------------- ui <- fluidPage( # Input functions textInput(inputId = 'search_term', label = '搜索近6-9天的推文:', placeholder = '#covid-19', width = '90%' ), actionButton(inputId = 'submit_button', label = '提交' ), # 替换为动态UI容器 uiOutput('twitter_container', width = "100%", height = "400px") ) # Server ------------------------------------------------------------------ server <- function(input, output) { # 获取数据 tweet_id <- eventReactive(input$submit_button, {sample(v_ids, 1)}) # 提交后先更新容器,再渲染新推文 observeEvent(input$submit_button, { # 生成新的输出容器,自动销毁旧容器和内容 output$twitter_container <- renderUI({ twitterwidgetOutput('twitter', width = "100%", height = "400px") }) # 在新容器中渲染新推文 output$twitter <- renderTwitterwidget(twitterwidget(tweet_id())) }) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者catlover3000
相关产品推荐
相关产品推荐

