#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
, но при этом сохраняете исходные данные.