R — Обработка нескольких данных (например, слияние, объединение, получение новых столбцов, сброс значений строк для каждого условия) в реактивном разделе

#r #shiny

Вопрос:

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

Он не работает при выводе объединенного набора данных из 2 динамических входных наборов данных sas.

DAT_A:

 A <- read.table(text = "
    ord, id, Score,DATE, VISIT
    1,001,23,2021-03-01,DAY 0
    2,001,26,2021-03-03,DAY 1
    3,001,45,2021-03-10,DAY 2
    4,001,41,2021-03-20,DAY 3
    5,001,67,2021-03-26,DAY 4", header = TRUE,sep = ",")
 

DAT_B:

 DAT_B <- read.table(text = "
    ord, id, Weight,DATE
    1,002,100,2021-03-01
    2,002,100.5,2021-03-03
    3,002,101,2021-03-06
    4,002,103,2021-03-20
    5,002,102,2021-03-28", header = TRUE,sep = ",")
 

Блестящий R:

 library(shiny)
library(shinyFiles)

ui<-fluidPage(sidebarLayout(
  
  sidebarPanel(
  ),
  
  mainPanel(
    DTOutput("combine")
  )
  
))

server <- function(input,output,session){
  
  #dir <- reactive(input$dir)
  volumes <- getVolumes()
  shinyDirChoose(input=input, 'dir', roots=volumes, session=session)
  path1 <- reactive({
    parseDirPath(volumes, input$dir)
  })
  
  
  DAT_A <- eventReactive(path1(), {
    DAT_A <- data.frame(haven::read_sas(paste0(path1(), "DAT_A.sas7bdat")))
    DAT_A
  })

  DAT_B <- eventReactive(path1(), {
    DAT_B <- data.frame(haven::read_sas(paste0(path1(), "DAT_B.sas7bdat")))
    DAT_B
  })
  
  
  output$combine = renderDT({
    
    c_all <- bind_rows(DAT_A(), DAT_B())
    
    head(c_all())
  })
  
  
}
shinyApp(ui = ui, server = server)
 

Комментарии:

1. Вы можете использовать fileInput для чтения 2 наборов данных SAS, а затем rbind их.

2. @YBS, не могли бы вы предоставить решение примера кода для этого?

Ответ №1:

Вы можете использовать один fileInput с multiple=TRUE или два отдельных с multiple=FALSE . Приведенный ниже код показывает последний способ сделать это.

 library(shiny)
library(haven)

ui<-fluidPage(sidebarLayout(
  
  sidebarPanel(
    fileInput("sasdata1", "Choose a SAS dataset", multiple = FALSE, accept = ".sas7bdat"),
    fileInput("sasdata2", "Choose a second SAS dataset", multiple = FALSE, accept = ".sas7bdat")
  ),
  
  mainPanel(
    DTOutput("combine")
  )
  
))

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

  DAT_A <- reactive({
    req(input$sasdata1)
    inData1 <- input$sasdata1
    if (is.null(inData1)){ return(NULL) }
    mydata1 <- haven::read_sas(inData1$datapath)
  })
  
  DAT_B <- reactive({
    req(input$sasdata2)
    inData2 <- input$sasdata2
    if (is.null(inData2)){ return(NULL) }
    mydata2 <- haven::read_sas(inData2$datapath)
  })
  
  output$combine = renderDT({
    
    c_all <- bind_rows(DAT_A(), DAT_B())
    
    #head(c_all())
  })
  
}
shinyApp(ui = ui, server = server)
 

выход