首页 > 解决方案 > getwd() 在 Shiny 应用程序中返回不存在的目录

问题描述

我有以下 Shiny 包:

DESCRIPTION

Package: mypackage
Version: 0.0.1
Depends: shiny

R/mypackage.R

ui <- shiny::fluidPage(getwd())
server <- function(input, output, session) {}

要安装和运行,我会

R -q -e "devtools::install(); shiny::runApp(shinyApp(mypackage:::ui, mypackage:::server))"

当我这样做时,我的应用程序输出

/tmp/RtmpC1viCa/R.INSTALL6931e8be933/mypackage

这不存在。

为什么会这样,我如何改进它?我已经看到它getwd()实际上可能不会返回用户工作目录 - 但为什么它返回一个不存在的目录?

标签: rshinyr-packageworking-directory

解决方案


在 Shiny 应用程序中,getwd()指的是应用程序目录。

但是,由于您正在创建一个包,因此您需要了解并小心执行代码的位置/时间。

包内文件范围内的代码在安装时执行。并且 R 包的安装发生在一个临时目录中以隔离它。事实上,R CMD check会警告你这一点。

如果您需要getwd()(以及其他特定于路径的函数,例如system.file)的值,则不能在文件范围内调用它。

解决方案是使用.onLoad包钩子。在您的情况下,您需要在包加载时创建和分配整个UI

.onLoad <- function (libname, pkgname) {
    assign(
        'ui',
        shiny::fluidPage(getwd()),
        topenv()
    )

}

如果您不喜欢使用assign,$<-也可以:

.onLoad <- function (libname, pkgname) {
    topenv()$ui <- shiny::fluidPage(getwd()),
}

但或者,您也可以创建一个返回 UI 的函数

ui <- function () {
    shiny::fluidPage(getwd())
}

并通过运行它

shiny::runApp(shinyApp(mypackage:::ui(), mypackage:::server))

推荐阅读