如何在learnr::tutorial markdown中导入帕尔默站最新摄像头图像?
解决learnr教程中插入帕尔默站实时摄像头图片的问题
我之前也碰到过类似的动态摄像头图片在R Markdown/learnr里无法正常显示的情况,帮你梳理下问题根源和可行的解决方案:
问题背后的原因
你用的图片URL带了动态参数(?=92056851.6281),这是网站用来规避浏览器缓存的随机戳——固定用这个参数的话,要么显示旧的缓存图,要么随着参数失效直接加载失败;另外部分网站会设置防盗链策略,直接引用外部图片URL可能被服务器拦截。
具体解决方案
方案1:用HTML标签+动态时间戳强制刷新
learnr支持直接嵌入HTML,我们可以手动添加时间戳参数,让每次打开教程时都请求最新的画面:
<img src="https://www.usap.gov/videoclipsandmaps/SouthPoleWebcam/Pal00095.jpg?r=<!--%20= Sys.time() %20-->" alt="南极洲帕尔默站实时摄像头画面" style="width: 100%;" />
这里的<!--%20= Sys.time() %20-->会被knitr解析为当前时间戳,每次加载页面都会生成新的参数,确保拿到最新的摄像头图像。
方案2:用R代码动态生成图片元素
如果更习惯用R代码控制,可以在learnr的代码块中生成带时间戳的图片标签,同时关闭代码输出(echo=FALSE):
library(htmltools) # 生成带时间戳的图片链接,避免缓存 img_url <- paste0( "https://www.usap.gov/videoclipsandmaps/SouthPoleWebcam/Pal00095.jpg", "?r=", as.integer(Sys.time()) # 用整数时间戳作为参数 ) # 生成HTML图片元素 tags$img( src = img_url, alt = "南极洲帕尔默站实时摄像头画面", width = "100%" )
把这段代码放在{r, echo=FALSE}的代码块中,learnr会自动渲染出最新的图片。
方案3:临时下载图片再显示(应对防盗链)
如果前两种方法因为防盗链无法加载,可以先把图片临时下载到本地,再插入到教程中:
# 创建临时文件存储图片 temp_img <- tempfile(fileext = ".jpg") # 下载最新图片(mode="wb"确保二进制下载正确) download.file( url = "https://www.usap.gov/videoclipsandmaps/SouthPoleWebcam/Pal00095.jpg", destfile = temp_img, mode = "wb", quiet = TRUE ) # 插入图片 knitr::include_graphics(temp_img)
这个方法的缺点是每次加载页面都要下载图片,可能有轻微延迟,但能绕过大部分防盗链限制。
内容的提问来源于stack exchange,提问作者Silviculturalist




