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

原问题代码
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
相关产品推荐
相关产品推荐

