#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)