Блестящее приложение и данные, встроенные в пакет R - PullRequest
0 голосов
/ 25 ноября 2018

Пакет включает приложение Shiny вместе с набором данных.Источник пакета находится на GitHub .

Встроенный набор данных используется для заполнения пользовательского интерфейса (поле Input1) и набора данных (в data / data_test.rda, dataframe с 3 полями {year_p,model_p, volume_p}) загрузка ленивым образом при загрузке пакета (для параметра файла описания LazyData установлено значение true).

Эти данные остаются идентичными на протяжении всего сеанса, поэтому я не хочу делать для них реактивную функцию. Проблема заключается в том, что если я использую набор данных для заполнения пользовательского интерфейса, пакет не будет собираться и выдает ошибку при сборке

Альтернативы, которые я рассмотрел:

  1. , чтобы иметь реактивную функцию (model_reactive ()) и наблюдаемыйEvent / updateSelectInput, определенный в server.R, но это действительно кажется неэффективным.Кстати, есть ли способ заставить реактивную функцию вычислять только один раз?

  2. поместить код, управляющий набором данных, в global.R, чтобы данные были доступны для server.R и пользовательского интерфейса..R

  3. Может быть, это сообщение объясняет, как поступить с окружающей средой, но я не понял.

ui.R

r shiny::selectInput("Input1", "Input1:", choices = model_ls, multiple = F, selectize = F) # error when building the package # ERROR: lazy loading failed for package 'TESTshinyapp'

server.R

r model_ls <- input_model(dat)

input.R

r input_model <- function(data) {dplyr::select(data, model_p) %>% dplyr::distinct() %>% unlist()}

1 Ответ

0 голосов
/ 26 ноября 2018

Корень проблемы в том, что ваш набор данных data_test находится вне области действия при разборе функций вашего пакета.Такое поведение ожидается, и большинство пакетов обходят это, используя функции, которые динамически загружают набор данных по мере необходимости.

Простой обходной путь делает именно это: определяя пользовательский интерфейс приложения как функцию

library(shiny)

ui <- function() {
  data(data_test, package = "TESTshinyapp")
  fluidPage(
    "Names of the dataset: ", 
    paste(names(data_test), collapse = ", ")
  )
}

server <- function(input, output, session) {

}

shinyApp(ui(), server)

Таким образом, данные будут загружаться динамически, когда приложение запускается так же, как на сервере.( ПРИМЕЧАНИЕ : в вашем текущем пакете sidebar также необходимо преобразовать в функцию для выполнения этой работы.)

Другая возможность - загрузить данные в launchApp, а затемсоздайте ui и server с фабричным шаблоном .Другими словами: набор данных помещается в область действия в launchApp и затем передается в качестве аргумента фабрикам.

server_factory <- function(myData) {
  function(input, output, session) {
    ## use myData here as you please
  }
}

ui_factory <- function(myData) {
  fluidPage(
    "Names of the dataset: ", 
    paste(names(myData), collapse = ", ")
  )
}

launchApp <- function() {
  data(data_test, package = "TESTshinyapp")

  shinyApp(
    ui_factory(data_test),
    server_factory(data_test)
  )
}

launchApp()

Этот шаблон также позволяет вам определять параметры для launchApp и передавать их взаводы, если хотите.

...