Here is a video which explains what I want.
I want to upload a file and then for each column, a checkbox should appear.
If the checkbox is checked, then a dropdown list and two textinputs should be shown for each column.
If it's not checked, then the checkbox and two textinputs should disappear.
This image has only two text inputs and a dropdown for the first column but it should have two textinput and dropdown for each checkbox.
Check out the analysis tab after uploading a data file
UI code:
shinyUI(
navbarPage(title="Analysis",
tabPanel(title="Input",
sidebarLayout(
sidebarPanel(
fileInput("file","Upload the file"),
checkboxInput('file_has_headers',"Take Column Names from the first row of the file",value= TRUE),
checkboxInput('show_head_only',"Display only first 6 rows. Uncheck this to see entire file",value= TRUE),
radioButtons(inputId = 'sep', label = 'Separator', choices = c(Comma=',',Semicolon=';',Tab='\t', Space=''), selected = ','),
textAreaInput("domains", 'Enter the comma separated list of dimensions, for example: verbal ability, numerical ability' ),
width = 4
),
mainPanel(
wellPanel(
DT::dataTableOutput("uploaded_table"
),# Displays the uploaded table by using js dataTable from DT package
),
width = 8
),
position = 'left'
)
), #End of Input Tab panel
tabPanel(title="Verification",
fluidRow(
column(2,
"V",
uiOutput('choose_columns')
),
column(2,
"Key",
textInput('anser_key',"",placeholder = 'e.g. A')
),
column(4,
"Dimension",
uiOutput("domain_dropdown",inline = FALSE)
),
column(3,
"Valid Options",
textInput('valid_options',"",placeholder = 'e.g. A,B,C,D')
),
) # End Fluid row
), #End of Verification Tab Panel
navbarMenu(title="Analayis",
tabPanel(title="Item Analysis", "content"
), #End of Item Analysis Tab Panel
tabPanel(title="Test Analysis", "content"
) #End of Test Analysis Tab Panel
) #End of navbarMenu
) #End of navbarPage
) #end of shinyUI
Server code:
library(shiny)
library(DT)
options(shiny.maxRequestSize=300*1024^2)
shinyServer(function(input, output) {
#1: Get the uploaded file in the data variable
data <- reactive({
uploaded <- input$file
#if(is.null(file1)){return("No file is selected or selected file is not in the right format. Please check the documentation and upload correct file.")}
req(uploaded) #req retruns a silence rather than error and is better than using if()
if(input$show_head_only){
head(read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)) #head() returns only first 6 rows
} else {
read.csv(file=uploaded$datapath, sep=input$sep,header = input$file_has_headers)
}
})
#2:set the elemet for domain dropdown list.
output$domain_dropdown <- renderUI({
items <- strsplit(input$domains,',')[[1]] #It creates a list and [[1]] retuns the list as c('','') which is needed for select input
selectInput(inputId = "domains", label = "", choices = items)
})
#3: set element to show the uploaded csv file as a table
output$uploaded_table<- DT::renderDataTable(
data(), # If a variable contains the output of reactive() function, it must be used as a function.
server=TRUE, #Important to keep this as true so that large datasets do not crash the browser
options = list(
scrollX = TRUE
),
) # End of uploaded table output setting
#4: Set dynamic checkboxes based on the number of columns in the data
output$choose_columns <- renderUI({
req(data())
colnames <- names(data())
checkboxGroupInput("columns", "Choose columns",
choices = colnames,
# selected = colnames
)
})
})
