Блестящее приложение не может получить доступ к данным, если runApp запускается из .Rprofile - PullRequest
0 голосов
/ 11 мая 2019

Я создал приложение Shiny, которое использует переменную списка (для настройки меток), которая создается из файла Excel.Имя этой переменной refvar

refvar создается в shinyServer() в server.R и используется для создания элементов пользовательского интерфейса, которые отправляются в ui.R.refvar также используется load.data().load.data() определено в global.R и используется в shinyServer().

Странно то, что если я запускаю приложение вручную (кнопка «Запустить приложение» в RStudio или runApp () из консоли RStudio), то оноработает, хотя, если я помещаю shiny::runApp() в файл .Rprofile, чтобы запустить приложение, как только я открываю свой проект RStudio, я получаю ошибку "ОШИБКА: объект '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' not found», но на самом деле я не использую какой-либо title объект.
Я пытался проверить состояние данных, которые я передал в ggplotчерез capture.output (str (Data)) и вывести его в ui.R через директиву uiOutput.Ошибка стала в том, что он мог найти функции str() и capture.output();Пакет утилит не был загружен!

Так что я полагаю, что проблема в том, что runApp () из .Rprofile запускается слишком рано.Как я могу это исправить?

1 Ответ

0 голосов
/ 11 мая 2019

Проблема заключалась в том, что пакеты по умолчанию все еще не загружаются при запуске .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)
}
...