getwd() returns 闪亮应用程序中不存在的目录

getwd() returns non-existent directory in Shiny app

我有以下闪亮的包裹:

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() 实际上可能不是 return 用户工作目录 - 但为什么它 return 是一个不存在的目录?

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

但是,由于您正在创建一个程序包,因此您需要注意并小心执行 where/when 代码。

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

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

解决方法是使用.onLoad package hook. In your case, :

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

}

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

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

但是您也可以创建一个 函数 ,returns UI:

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

并且运行它通过

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