Код в функции server()
действительно должен только устанавливать реактивные объекты и реагировать на реактивные события.В теле самой функции server()
не должно быть никаких данных о манипулировании данными, потому что при запуске данные еще не доступны.Нечто подобное имеет больше смысла
ui <- fluidPage(
fluidPage(
titlePanel("Uploading Files"),
fileInput('myFile', 'Choose File'),
tableOutput('contents')
)
)
server <- function(input, output) {
a1 <- reactive({
req(input$myFile)
read_excel(input$myFile$datapath)
})
newdata <- reactive({
a1 <- a1()
x <- as.POSIXct(a1$Month)
a1$mo <- strftime(x, "%m")
a1$yr <- strftime(x, "%Y")
a1$qrt <- quarter(x, with_year = FALSE, fiscal_start = 01)
newdata <- a1[grepl("Y", a1$`Quota Held Flag`),]
#fixing participation column into categorical for donut chart
newdata$Participation[is.na(newdata$Participation)] <- 0
newdata$Participation <- factor(newdata$Participation, labels = c("0-99%","100%"))
#grouping data
newdata %>%
group_by(yr, mo, qrt)
})
output$contents <- renderTable(
newdata()
)
}
shinyApp(ui = ui, server = server)
Обратите внимание, как a1
читает файл, который загружает пользователь.Тогда реактивный объект newdata
будет обновляться всякий раз, когда обновляется a1
, и преобразует данные для вас.Затем мы можем подключить это к выводу, чтобы он действительно был обработан.