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.