Reputation: 53
I am trying to create a Shiny app that will allow users to upload their own data as a csv, perform some basic calculations, and then export the raw + calculated data as a csv. I am able to get the calculations showing in a table within the app, but I can't get the data to download correctly. When I try to download the raw + calculated data, it just downloads the raw data. Below is the code I have for the ui and server. Any help is greatly appreciated.
library(shiny)
library(dplyr)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Whole-rock anhydrous conversion"),
# Upload csv file
sidebarLayout(
sidebarPanel(
fileInput(
inputId = "csvFile",
label = "Upload csv file",
accept = c(".csv")
),
downloadButton("download", "Download anhydrous data")
),
mainPanel(
tableOutput("modifiedData")
)
)
)
# Define server logic to calculate anhydrous concentrations
server <- function(input, output) {
rawData <- eventReactive(input$csvFile, {read.csv(input$csvFile$datapath)})
output$modifiedData <- renderTable({rawData() %>%
# Calculate anhydrous concentrations
mutate(LOI_Factor = Total/(Total-LOI)) %>%
mutate(Anhydrous = "") %>%
mutate(SiO2_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(TiO2_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(Al2O3_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(Fe2O3_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(MnO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(MgO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(CaO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(Na2O_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(K2O_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(Cr2O3_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(P2O5_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(SrO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(BaO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO)))
})
output$download <- downloadHandler(
filename = function() {paste("Anhydrous_data.csv", Sys.Date(), ".csv", sep = "")},
content = function(file){
write.csv(rawData(), file, row.names = FALSE)
}
)
}
# Run the application
shinyApp(ui = ui, server = server)
Upvotes: 0
Views: 809
Reputation: 21349
Try this
server <- function(input, output) {
rawData <- eventReactive(input$csvFile, {
req(input$csvFile)
df <- read.csv(input$csvFile$datapath)
mydf <- df %>%
# Calculate anhydrous concentrations
mutate(LOI_Factor = Total/(Total-LOI)) %>%
mutate(Anhydrous = "") %>%
mutate(SiO2_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(TiO2_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(Al2O3_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(Fe2O3_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(MnO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(MgO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(CaO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(Na2O_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(K2O_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(Cr2O3_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(P2O5_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(SrO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO))) %>%
mutate(BaO_anh = SiO2 * (100/ (SiO2 + TiO2 + Al2O3 + Fe2O3 + MnO + MgO + CaO + Na2O + K2O + Cr2O3 + P2O5 + SrO + BaO)))
mydf
})
output$modifiedData <- renderTable({rawData() })
output$download <- downloadHandler(
filename = function() {paste("Anhydrous_data.csv", Sys.Date(), ".csv", sep = "")},
content = function(file){
write.csv(rawData(), file, row.names = FALSE)
}
)
}
Upvotes: 1