Shiny应用中getwd()返回不存在目录的问题排查与解决
问题成因
你遇到的路径不存在问题核心是getwd()的执行时机错误:
R包安装阶段会将源文件解压到/tmp下的临时安装目录,逐行执行R目录下的所有脚本完成包的加载。你在包脚本中直接给ui变量赋值,赋值语句中的getwd()会在包安装阶段就执行,拿到的是当时的临时安装路径。等包安装完成后,该临时目录会被系统自动删除,后续启动Shiny应用时,ui中存储的就是已经失效的临时路径。
修复方案
根据你的使用场景可以选择以下任意一种修复方式:
- 方案1:将ui改为函数,延迟
getwd()的执行时机到应用启动阶段
修改R/mypackage.R代码:
# 定义为函数,调用时才会执行内部逻辑 ui <- function() { shiny::fluidPage(getwd()) } server <- function(input, output, session) {}
启动应用时调用函数生成ui即可:
R -q -e "devtools::install(); shiny::runApp(shinyApp(mypackage:::ui(), mypackage:::server))"
此时getwd()会在你执行启动命令的时刻运行,返回的就是你当前的工作目录。
- 方案2:若需要获取包本身的安装路径,使用
system.file函数
如果你要展示的是包的安装路径而非用户工作目录,用R包原生的路径获取函数更稳定:
# 直接返回包的实际安装路径,不受临时目录影响 pkg_path <- system.file(package = "mypackage") ui <- shiny::fluidPage(pkg_path) server <- function(input, output, session) {}
- 方案3:将路径获取逻辑放到server端执行
Shiny的server函数只会在应用启动时运行,不会在包安装阶段执行,也能拿到正确路径:
ui <- shiny::fluidPage(shiny::textOutput("current_wd")) server <- function(input, output, session) { output$current_wd <- shiny::renderText(getwd()) }
内容的提问来源于stack exchange,提问作者bers
相关产品推荐
相关产品推荐

