Hi Folks,
I would like to download a csv file from a bank website and plot each of the 400 expenditure columns in graphs in r shiny. The user should be able to select which of the 400 columns they wish to see on a plot and these plots should have the Date (the first column in the dataframe) on the x axis and the expenditure data on the y axis.
I have an r code to download the csv to a directory, unzip this file, open in r, and put the data into a dataframe.
I have the basic code for an r shiny app, obtained from here : https://rstudio.github.io/shinydashboard/get_started.html
My question is where can I put this r code I have to dowload the file into a dataframe, into the r shiny code?
does it go into the ui<-fluidpage section? or into the server<-function(input, output) section?
If the download does not need to be called dynamically (i.e., it just needs to be done once when the app is loaded) then you can just put the code to download it at the top of your script outside of both your ui
and server
elements (if you are building the app from a single file, if you are using separate files, ui.R
and server.R
, then I would put it in my global.R
file). This code will be run when the app is loaded and then you can just reference the dataframe from inside your server
function with whatever name you assigned it.
1 Like
Alternatively, if you want to be able to redownload to file mid session, then you can add an action button in your ui code and then use an eventReactive()
call with the action button as the trigger and your code to download the data inside it.
This is perfect, thank you so much @tbradley!
I have one more question, I hope this is okay:
There are over 400 columns in my dataframe. The aim of the r shiny app is for the user to select from a drop down which currency they'd like to see on the plot.
In the server section, inside a renderplot{()} function must I create a plot for each of the 400 columns?
Thank you in advance
No. I would create a vector of the column names with something like:
col_names <- colnames(data)
and then I would render a ui in my server code using renderUI
with a selectInput()
call inside it, where the choices
argument for your selectInput()
is set to col_names
. From there you filter your dataframe with the selected choice of that input. I would save that as a new reactive dataframe and then use that reactive value inside of your renderPlot()
call.
If you are not familiar with renderUI()
, it is the same as other render
functions in that you need to place a corresponding output
function in your ui
code. In this case, the output function is uiOutput()
There are a few ways you could go about selecting the columns to include based on the selectInput
value selected. The easiest way if you are not familiar with tidyeval
would be like this:
data[ , input$selected_cols]
by default, the value returned by a select input is a vector so even if you allow the user to select multiple choices, that will properly subset your data. (NOTE: input$select_cols
is my simulated inputId
for your selectInput()
call.
1 Like
Thank you again for your help, @tbradley
One other thing, if you choose the option for loading your data outside of your server
function, then you can create the col_names
vector outside of it as well. If you do it that way then you can create the selectInput()
directly in your ui
and skip the renderUI()
step. If you load your data with the eventReactive()
method, then you will need to use renderUI