我有以下闪亮包:
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()
实际上可能不会返回用户的工作目录 - 但为什么它返回一个不存在的目录?
在Shiny应用程序中,
getwd()
指的是应用程序目录。
但是,由于您正在创建包,因此您需要了解并小心代码的执行位置/时间。
包内文件范围内的代码在安装时执行。 R 包的安装发生在临时目录中以隔离它。事实上,R CMD check
会警告您这一点。如果您需要
getwd()
的值(以及其他路径特定函数,例如
system.file
),则不能在文件范围内调用它。 解决方案是使用
包钩子。在您的情况下,您需要在包加载时创建并分配整个 UI:
.onLoad <- function (libname, pkgname) {
ns <- topenv()
ns$ui <- shiny::fluidPage(getwd())
}
但是您也可以创建一个返回 UI 的函数:
ui <- function () {
shiny::fluidPage(getwd())
}
并通过运行它
shiny::runApp(shinyApp(mypackage:::ui(), mypackage:::server))