Как создать и изменить копию фрейма данных в Shiny R

#r #shiny

#r #блестящий

Вопрос:

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

         ##########################################################################################
    reactiveData <- reactiveValues(df = NULL)
    
    #This function is responsible for loading in the selected file
    observe({
            req(input$file_selector)
            rv$df <- read.csv(paste0(parseDirPath(c(home = 'C:\Users\Ruben\Desktop\Test_QC_Program\FiveMin'), file_dir()),'\',input$file_selector),skip=1,na.strings='Null') # Simplified for testing
    })
    
    # This previews the CSV data file
    output$filetable <- renderDataTable({
            rv$df
    })
    
    observeEvent(input$qc_final_cols, {
            if (input$qc_final_cols){
                    utc <- ymd_hms(rv$df$TmStamp,tz='UTC')
                    ldt <- with_tz(utc,tzone='America/Chicago')
                    bv0 <- which(hour(ldt) == 0 amp; minute(ldt) == 0 amp; second(ldt) == 0)
                    if (length(bv0) > 0){
                            ldt[bv0] <- ldt[bv0] - 1}
                    
                    rv$df <- rv$df %>%
                            add_column(LDT = as.character(ldt), .after = 'TmStamp')
                    
                    for (v in 1:length(var_names)){
                            ind <- which(colnames(rv$df) == var_names[v])
                            rv$df <- rv$df %>% 
                                    add_column(z = NA,.after = ind)
                            colnames(rv$df)[ind 1] <- paste0(var_names[v],'_QC')
                            rv$df <- rv$df %>% 
                                    add_column(y = NA,.after = ind 1)
                            colnames(rv$df)[ind 2] <- paste0(var_names[v],'_Final')
                    }
            }
    })
    #######################################################################################
  

Есть ли способ обратиться к исходному фрейму данных, который я прочитал, как я пытаюсь в приведенном ниже коде, чтобы я мог создать новый отдельный фрейм данных? Я хочу, чтобы новый фрейм данных был реактивным, а не исходный вывод $ rawdata.

         output$rawdata <- renderDataTable({
            req(input$station_file)
            rawdata <- read.csv(input$station_file$datapath,
                                header = input$header,
                                skip = input$skip,
                                na.strings = input$nastrings)
    })
    
    qcdata <- reactiveValues(df = "rawdata")  ##RIGHT HERE I AM TRYING TO
REFER TO THE ORIGINALLY READ IN DATA, BUT UNSUCCESSFULLY
    
    observeEvent(input$station_file, {
                    utc <- ymd_hms(qcdata$df$TmStamp,tz='UTC')
                    ldt <- with_tz(utc,tzone='America/Chicago')
                    bv0 <- which(hour(ldt) == 0 amp; minute(ldt) == 0 amp; second(ldt) == 0)
                    if (length(bv0) > 0){
                            ldt[bv0] <- ldt[bv0] - 1}

                    qcdata$df <- qcdata$df %>%
                            add_column(LDT = as.character(ldt), .after = 'TmStamp')

                    for (v in 1:length(var_names)){
                            ind <- which(colnames(qcdata$df) == var_names[v])
                            qcdata$df <- qcdata$df %>%
                                    add_column(z = NA,.after = ind)
                            colnames(qcdata$df)[ind 1] <- paste0(var_names[v],'_QC')
                            qcdata$df <- qcdata$df %>%
                                    add_column(y = NA,.after = ind 1)
                            colnames(qcdata$df)[ind 2] <- paste0(var_names[v],'_Final')
                    }
    })

    # This previews the CSV data file
    output$qcdata <- renderDataTable({
            qcdata$df
  

Ответ №1:

Когда вы читаете свои данные, вы можете сделать их копию. Это не определено в вашем коде выше, но я предполагаю, что это rv тоже reactiveValues объект. Затем вы можете сделать:

 rv <- reactiveValues()
observe({
            req(input$file_selector)
            rv$original_data <- read.csv(paste0(parseDirPath(c(home = 'C:\Users\Ruben\Desktop\Test_QC_Program\FiveMin'), file_dir()),'\',input$file_selector),skip=1,na.strings='Null') # Simplified for testing
            rv$df <- rv$original_data
    })
  

После этого вы можете выполнять свои вычисления с rv$df , но при этом сохраняете исходные данные.