r - 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()
实际上可能不会返回用户工作目录 - 但为什么它返回一个不存在的目录?
解决方案
在 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))
推荐阅读
- python - SyntaxError:python 中的语法无效(无法运行代码)
- android - 为什么 .format 仅在设备上使应用程序崩溃?
- python-3.x - 有没有办法保存用 python 和 pyqt5 开发的桌面应用程序的进度?
- sql - 根据营业时间而不是总时间计算处理时间
- angular - 分页引导当前页面角度的颜色
- scala - 如何仅为包含验证规则的消息生成验证器文件?
- java - 我的数组中的对象将变为空(java)
- ios - 如何在swift中更新其他viewController的标签
- yocto - 哪个配方将首先使用?
- python-3.x - 使用 Boto3 Python 列出 AWS S3 存储桶中的所有对象及其存储类