Загрузите фрейм данных один раз и используйте его везде в блестящем приложении - PullRequest
3 голосов
/ 22 сентября 2019

В Shiny мы загружаем данные на сервер, завернутые в реактивные скобки.Файл читается через read_csv ().Теперь, когда мы хотим использовать этот фрейм данных для разных задач, мы вызываем эту реактивную функцию, которая читает фрейм данных.Это кажется неэффективным.Есть ли способ просто прочитать кадр данных и использовать его во всем приложении?

  ## Upload Datafrma
  uploadDataframe <- reactive({
    if (is.null(input$uploadData_uploadFile)) return (NULL)
    df <- read_csv(input$uploadData_uploadFile$datapath)

    return(df)
  }) 

  ## Display Table
  output$uploadData_df <- renderDataTable({
    uploadDataframe()
  })

  ## Show Summary of Table
  output$uploadData_Summary <- renderText({
    summary(uploadDataframe())
  })

  ## Plot
  output$uploadData_Summary <- renderText({
    ggplot(uploadDataframe()) + ...
  })

В приведенном выше примере мы вызываем uploadDataFrame() реактивную функцию для каждой задачи, которую мы хотим выполнить, которая, в свою очередь, снова и снова считывает данные из файловой системы.Если набор данных большой, уйдет много времени на его чтение снова и снова.Есть ли способ, где мы можем просто прочитать данные один раз и использовать их везде?Данные должны быть изолированы для каждого пользователя.

Ответы [ 3 ]

2 голосов
/ 22 сентября 2019

Блестящий уже справляется с этим эффективно.Реактив uploadDataFrame() оценивается только один раз, когда он необходим в первый раз, а затем переоценивается только тогда, когда ввод, от которого он зависит, становится недействительным (в этом случае, если input$uploadData_uploadFile изменяется),Таким образом, в этом случае read_csv вызывается только один раз для каждого входного файла, а не каждый раз, когда вы вызываете реактив.

Более того, Shiny будет оценивать / переоценивать любые реактивные лениво, т. Е. Только когда реактивное значение равно 1012 * требуется *.Поэтому, если вы никогда не используете uploadDataFrame() в своем коде, read_csv никогда не будет вызываться, даже если вы загрузите файл.

1 голос
/ 22 сентября 2019

Если я правильно понимаю, вы можете сохранить данные в реактиве и загружать данные только в том случае, если data.frame еще не существует.В следующем примере вы увидите, что рендеринг таблицы занимает только 2 секунды в начале.

    library(shiny)

    # Define UI for application that draws a histogram
    ui <- fluidPage(

    # Application title
    titlePanel("DF"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            actionButton("up","Upload")
        ),

        # Show a plot of the generated distribution
        mainPanel(
            DT::dataTableOutput("table")
        )
    )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

    exist <- reactiveValues(df = NULL)

    uploadDataframe <- eventReactive(input$up,{

        if (is.null(exist$df)) {

        Sys.sleep(2)

        data <- data.frame("a"=c(1,1),"b"=c(2,2))

        exist$df <- data

        } else {

        data <- exist$df    

        }

        data


    }) 


    output$table <- DT::renderDataTable({
        uploadDataframe()
    })

}

# Run the application 
shinyApp(ui = ui, server = server)

Вы можете просто заменить actionButton и образец df загруженными данными.

0 голосов
/ 22 сентября 2019

Рассматривали ли вы возможность использования serviceWorkers для чтения данных один раз и их повсеместного использования.Зайдите в MDN (Сеть разработчиков Mozilla).Я думаю, что есть статья о работниках сферы обслуживания и о повторяющихся задачах, которые вы описали здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...