R Shiny:如何将图片源从www目录改为集中存储路径?
解决Shiny应用调用集中存储图片的问题
我之前也碰到过类似的需求,要把多个Shiny应用的图片统一存在外部目录,不用每个应用都复制一份。你用addResourcePath的思路是对的,但可能是别名选得不对或者细节没注意到,下面给你一步步讲怎么弄:
正确使用addResourcePath的步骤
首先,别用www作为映射的别名——Shiny本身已经默认把应用目录下的www文件夹映射到根路径了,用同一个别名会冲突,导致要么外部图片加载失败,要么原本应用内的资源出问题。
- 设置资源映射
在你的Shiny应用代码的全局环境(也就是server和ui定义之前),调用addResourcePath,给外部图片目录起一个独特的别名,比如central_images:
addResourcePath("central_images", "/opt/images_central")
这里第一个参数是浏览器访问时要用的路径前缀,第二个是服务器上图片存储的真实绝对路径。
- 在UI中引用图片
之后在UI里用这个别名作为路径前缀来调用图片就行,不管是用tags$img还是img函数都可以:
tags$img(src = "central_images/plant123.img", width = "300px") # 或者更简洁的写法 img(src = "central_images/flower456.png", height = "200px")
容易踩的坑
- 权限问题:这是最常见的原因!Shiny运行的用户(比如用Shiny Server部署时的
shiny用户,或者本地运行时你的个人用户)必须有读取/opt/images_central目录和里面图片的权限。可以用下面的命令调整:sudo chown -R shiny:shiny /opt/images_central sudo chmod -R 755 /opt/images_central - 路径正确性:一定要确认
/opt/images_central确实存在,图片文件名(包括大小写、后缀)完全匹配,别打错字。 - 别覆盖默认映射:再次强调,不要用
www作为别名,否则会覆盖Shiny默认的应用内www目录的访问路径,引发不必要的问题。
完整示例代码
这里给你一个可以直接测试的小例子:
# 全局设置资源路径 addResourcePath("central_images", "/opt/images_central") ui <- fluidPage( titlePanel("集中存储图片测试"), # 引用外部目录里的图片 tags$img(src = "central_images/plant123.img", width = "300px"), img(src = "central_images/flower456.png", height = "200px") ) server <- function(input, output) { # 这里可以加你的服务器逻辑 } shinyApp(ui = ui, server = server)
这样设置后,你的所有Shiny应用都可以通过这个方式调用集中存储的图片,不用再把图片复制到每个应用的www目录里啦。
内容的提问来源于stack exchange,提问作者Mike.Gahan
相关产品推荐
相关产品推荐

