Shiny Server中r2d3调用本地JS渲染D3图表失败的解决咨询
解决Shiny部署后r2d3调用本地JS文件的问题
问题根源
本地运行Shiny时,工作目录默认是app根目录,相对路径能正确定位到www/barchart.js;但部署到Shiny Server后,工作目录可能不是app根目录,导致相对路径解析失败。而system.file是从包目录读取文件,不受工作目录影响,所以能正常运行。
解决方案
无需创建包或依赖system.file,通过绝对路径定位JS文件即可解决本地与部署环境的路径差异问题,具体有两种可行方法:
方法1:用Shiny内置函数获取app根目录
通过shiny::getAppDir()获取当前app的绝对根目录,再拼接JS文件路径,适配所有运行环境:
修改server.R代码如下:
function(input, output,session) { data=c(0.3, 0.6, 0.8, 0.95, 0.40, 0.20) # 获取app根目录的绝对路径 app_root <- shiny::getAppDir() output$d31 <- renderD3({ r2d3( data = data, script = file.path(app_root, "www", "barchart.js"), d3_version = "5") }) # 可选:将barchart.js移到app根目录(与server.R同级)时的写法 # output$d32 <- renderD3({ # r2d3( data = data, # script = file.path(app_root, "barchart.js"), # d3_version = "5") # }) output$d33 <- renderD3({ r2d3( data = data, script = system.file("examples/barchart.js", package = "r2d3"), d3_version = "5") }) }
方法2:直接指定绝对路径(适合固定部署场景)
如果明确Shiny Server上app的部署路径,可直接写死绝对路径(灵活性差,仅推荐固定环境使用):
script = "/srv/shiny-server/test/www/barchart.js"
关键注意事项
- 不需要用
tags$head手动引入JS脚本,r2d3会自动将脚本内容嵌入输出,手动引入易导致冲突。 - 确保Shiny Server对JS文件有读取权限,可通过命令
chmod o+r www/barchart.js开放读取权限。
内容的提问来源于stack exchange,提问作者user12256545
相关产品推荐
相关产品推荐

