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

如何在R的gt表格中处理球员头像HTTP 404错误并设置fallback图片

问题描述

我尝试用gt表格展示带圆形裁剪头像的棒球球员数据,但球员Cameron Sisneros没有可用头像,导致HTTP 404错误。理想状态下,当球员无头像时,应该默认显示裁剪后的小联盟棒球logo。现在删掉这个球员后代码能正常运行(效果如图),但我需要一个更具扩展性的解决方案,能显示所有球员,同时给无头像的球员加载备用图片。

移除无头像球员后的gt表格效果

原问题代码
library(cropcircles)
library(tidyverse)
library(gt)
library(gtExtras)
 
df_test <- structure(list(player = c("Matt Shaw", "Owen Caissie", 
                                     "Cameron Sisneros"), 
          matchup_batter_id = c(807713L, 683357L, 815133L), 
          HR = c(4L, 4L, 3L)), 
          row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame")) %>%  
   
 # filter(player != 'Cameron Sisneros') %>% 
  mutate(headshot = paste0("https://img.mlbstatic.com/mlb-photos/image/upload/c_fill,g_auto/w_360/v1/people/",matchup_batter_id,"/headshot/milb/current")) %>% 
  mutate(headshot = cropcircles::circle_crop(headshot,
                                border_size = 12,
                                border_colour = "black")
          ) # 理想情况:HTTP 404时默认显示裁剪后的联盟logo
  # 联盟logo链接:https://images.ctfassets.net/iiozhi00a8lc/7eeTdW5zGYe0sW2ZlIle7E/990464d4b5e4e3b3a65cb6c56ce808ea/milb-alt.svg

# 构建gt表格
df_test %>% 
  gt() %>% 
  gt_img_rows(headshot, height = 37, img_source = "local") # 添加裁剪后的头像
解决方案

核心思路是先检测头像链接的有效性,自动替换无效链接为备用logo,再统一执行圆形裁剪,实现扩展性处理。

完整代码

library(cropcircles)
library(tidyverse)
library(gt)
library(gtExtras)
library(httr) # 用于检查HTTP响应状态

# 定义函数:检查URL是否可访问(返回200状态码)
check_url_valid <- function(url) {
  tryCatch({
    # 用HEAD请求只获取状态码,比GET更高效
    resp <- HEAD(url, timeout(5))
    status_code(resp) == 200
  }, error = function(e) {
    # 超时或其他异常均视为无效链接
    FALSE
  })
}

# 备用联盟logo链接
fallback_logo <- "https://images.ctfassets.net/iiozhi00a8lc/7eeTdW5zGYe0sW2ZlIle7E/990464d4b5e4e3b3a65cb6c56ce808ea/milb-alt.svg"

df_test <- structure(list(player = c("Matt Shaw", "Owen Caissie", 
                                     "Cameron Sisneros"), 
                          matchup_batter_id = c(807713L, 683357L, 815133L), 
                          HR = c(4L, 4L, 3L)), 
                     row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame")) %>%  
  # 生成球员头像链接
  mutate(headshot = paste0("https://img.mlbstatic.com/mlb-photos/image/upload/c_fill,g_auto/w_360/v1/people/",matchup_batter_id,"/headshot/milb/current")) %>% 
  # 批量检测并替换无效链接
  mutate(headshot = ifelse(map_lgl(headshot, check_url_valid), headshot, fallback_logo)) %>%
  # 对所有链接统一执行圆形裁剪
  mutate(headshot = cropcircles::circle_crop(headshot,
                                             border_size = 12,
                                             border_colour = "black"))

# 生成最终gt表格
df_test %>% 
  gt() %>% 
  gt_img_rows(headshot, height = 37, img_source = "local")

关键细节

  • 高效检测:用HEAD请求替代GET,仅获取响应状态码,避免下载完整图片,提升处理速度
  • 异常处理:通过tryCatch()捕获网络超时、链接错误等异常,确保流程不会中断
  • 扩展性:新增球员时无需修改逻辑,无效头像会自动替换为logo
  • 统一裁剪:所有图片(包括备用logo)都会执行圆形裁剪,保证表格样式统一

内容的提问来源于stack exchange,提问作者Violin125

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:43:16