我构建了一个Shiny应用,该应用利用了从Excel文件创建的列表变量(用于标签自定义)。此变量的名称为refvar
refvar
在server.R的shinyServer()
中创建,用于构建发送到ui.R的UI元素。 refvar
也使用load.data()
。
load.data()
定义为global.R,并用于shinyServer()
。
奇怪的是,如果我手动运行应用程序(RStudio控制台中的“运行应用程序”按钮或RStudio控制台中的runApp()),则可以运行,而如果我将shiny::runApp()
放在.Rprofile文件中,则可以启动该应用程序打开RStudio项目后,在浏览器中显示错误“ ERROR:object'refvars'not found”。
这是(应该是)相关的代码
.Rprofile
shiny::runApp()
server.R
shinyServer(function(input, output) {
refvars <- read_excel('Labels.xlsx') %>% dplyr::select(1:2) %>% set_colnames(c('Var', 'Label')) %>% mutate_all(str_squish) %>% spread(Var, Label) %>% as.list
Data <- load.data()
output$UI.report.sel.text <- renderUI({helpText(refvars$report.sel.text)})
output$UI.daterange.sel.text <- renderUI({helpText(refvars$daterange.sel.text)})
#[...]
})
global.R
load.data <- function() {
tryCatch(read_excel("Report_data.xlsx"), error = function(e) file.choose()) %>%
rename(!!c(
Anno = refvars$year,
Mese = refvars$month,
Indagine = refvars$report,
Reparto = refvars$context,
Note = refvars$notes,
Problemi = refvars$problems,
Sforamenti = refvars$non.compliance,
Protocollo = refvars$id
)) %>%
mutate(
Data = ymd(paste(Anno, Mese, '1', sep = '-'))
)
}
更新:
我做了一些实验,将refvar
放在global.R。中。现在,该应用程序可以从.Rprofile很好地启动,但是有些地方坏了。例如,在应该存在ggplot的地方,我得到“错误:找不到对象'title'”,但实际上我没有使用任何title
对象。
我试图检查通过capture.output(str(Data))传递给ggplot的数据的状态,并通过uiOutput指令将其输出到ui.R。错误变成它可以找到函数str()
和capture.output()
; util包未加载!
所以我想问题是来自.Rprofile的runApp()运行得太早了。我该如何解决?
答案 0 :(得分:0)
问题完全在于,运行.Rprofile时仍未加载默认软件包。
因此,相反,我不得不重新定义.First.sys函数,在其中添加我的runApp代码:
.Rprofile
pkg.require <- function(pkgs, load = T){
installed <- utils::installed.packages()
not.installed <- c()
for (pkg in pkgs) {
if (!(pkg %in% installed)) not.installed <- c(not.installed, pkg)
}
if (length(not.installed) > 0) utils::install.packages(not.installed)
if (load) for (pkg in pkgs) library(pkg, character.only = TRUE)
}
.First.sys <- function ()
{
for (pkg in getOption("defaultPackages")) {
res <- require(pkg, quietly = TRUE, warn.conflicts = FALSE,
character.only = TRUE)
if (!res)
warning(gettextf("package %s in options(\"defaultPackages\") was not found",
sQuote(pkg)), call. = FALSE, domain = NA)
}
pkg.require(c('shiny'))
shiny::runApp(launch.browser = T)
}