You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:54:02