如果runApp是从.Rprofile运行的,则闪亮的应用程序将无法访问数据

时间:2019-05-11 11:04:56

标签: r shiny initialization rprofile

我构建了一个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()运行得太早了。我该如何解决?

1 个答案:

答案 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)
}