Hi,
I'm sorry that this is a basic question. I'm new to shiny and still getting my head around reactive programming.
I'm creating a shiny app for quality control of a large data.frame, that needs a human to manually examine each row. Essentially, I want to show a row of a data.frame on the screen, then the user presses a button which updates a "reject" column.
Despite getting lots of the reactive tutorials to run, I'm really struggling on the reactive bit here.
There's a reproducible simplified version below. What I would like is
- for the radio buttons to update the "reject" column for each row based on the radio button
- both on the screen
- but also in the reject column of the data.frame itself, so it exists after the shinyapp has been closed down
I know the answer is probably really simple and I'm guessing something to do with updateRadioButtons, observe or isolate. But I just can't work it out and I would love some pointers if someone has 5 mins spare.
tablein <- data.frame(Data=c("Hello","Goodbye","Maybe"),Data2=c(1,2,3),reject=FALSE)
ui <- fluidPage(
# Plot the row of the table
DT::dataTableOutput("table"),
hr(),
# Now add whether you have screened it or not
fluidRow(
column(3,offset=1,htmlOutput("reject"))
),
hr(),
fluidRow(
column(3,radioButtons(inputId = "toreject",
label = "Do you reject?",
choices =c("reject","keep")))),
hr(),
# And scroll through the table
fluidRow(
column(3,
sliderInput(inputId = "row",
label = "Row Number:",
min = 1,
max = 3,
value = 1)
)
)
)
server <- function(input, output,session) {
YourData <- reactive(tablein[input$row,1:2])
Reject <- reactive({
YourText2 = as.character(data_bib$reject[input$row])
if(isTRUE(YourText2)){YourText3 <- "REJECT!!"}else{YourText3 <- "Do not reject"}
return(YourText3)
})
output$table <- DT::renderDataTable({ data <- YourData() }, escape = FALSE)
output$reject <- renderUI({
HTML(paste(Reject(), sep = '<br/>'))
})
}
shinyApp(ui = ui, server = server)
Thanks,
Sam