Home > front end >  Shiny rhandsontable automatic values depending on User
Shiny rhandsontable automatic values depending on User

Time:12-14

I have a table, in which the user will give as input some groups. As a result, I want another column to automatically update and show the frequency (or replicate) of each group:

This code creates this app:

library(shiny)
library(rhandsontable)
library(tidyverse)

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Application title
    titlePanel("Automatic data rhandsontable"),

    # Sidebar with a slider input for number of bins
    sidebarLayout(
        sidebarPanel(
        ),

        # Show a plot of the generated distribution
        mainPanel(
            rhandsontable::rHandsontableOutput('ed_out'),

           shiny::actionButton('start_input', 'save final table')
        )
    )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

    # This has to be reactive
    data <- reactive({

        df <- data.frame(Animal = c('Dog', 'Cat', 'Mouse', 'Elephant', 'Tiger'),
                         Group = ' ',
                         replicate = as.numeric(' '))

    })

    output$ed_out <- rhandsontable::renderRHandsontable({

        df <- data()

        rhandsontable(
            df,
            height =  500,
            width = 600) %>%
            hot_col('replicate', format = '0a', readOnly = TRUE) %>%
            hot_col('Animal', readOnly = TRUE)

    })
    
    # This is just to save the table when the user has finished, can be ignored

    group_finals <- reactiveValues()

    observeEvent(input$start_input, {

        group_finals$data <-  rhandsontable::hot_to_r(input$ed_out)

        print(group_finals$data)
        }
    )


}

# Run the application
shinyApp(ui = ui, server = server)

enter image description here

So the idea is that the user, inputs the groups and the replicate is automatically updated: (here the user gives as input B, B, A, A, B.

enter image description here

I am able to count the replicates of each group, but I'm not sure how where to implement this part to calculate them and display them at the same time after the user inputs each group.

 df <- df %>%
        group_by(Group) %>%
        mutate(replicate = 1:n())

Not sure if this is the best approach, I tried a bit with the hot_to_col renderer to use javascript but I'm unfamiliar with that language.

CodePudding user response:

Sorry but I'm not familiar with the tidyverse - so I switched to data.table.

hot_to_r is the right way to go:

library(shiny)
library(rhandsontable)
library(data.table)

# Define UI for application that draws a histogram
ui <- fluidPage(
  
  # Application title
  titlePanel("Automatic data rhandsontable"),
  
  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
    ),
    
    # Show a plot of the generated distribution
    mainPanel(
      rhandsontable::rHandsontableOutput('ed_out'),
      
      shiny::actionButton('start_input', 'save final table')
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  
  # This has to be reactive
  data <- reactive({
    data.frame(Animal = c('Dog', 'Cat', 'Mouse', 'Elephant', 'Tiger'),
               Group = '',
               replicate = NA_integer_)
  })
  
  myData <- reactiveVal()
  
  observeEvent(data(),{
    myData(data())
  })
  
  output$ed_out <- rhandsontable::renderRHandsontable({
    rhandsontable(
      myData(),
      height =  500,
      width = 600) %>%
      hot_col('replicate', format = '0a', readOnly = TRUE) %>%
      hot_col('Animal', readOnly = TRUE)
    
  })
  
  observeEvent(input$ed_out, {
    userDT <- rhandsontable::hot_to_r(input$ed_out)
    setDT(userDT)
    userDT[, replicate := seq_len(.N), by = Group][is.na(Group) | Group == "", replicate := NA_integer_]
    myData(userDT)
  })
  
  # This is just to save the table when the user has finished, can be ignored
  group_finals <- reactiveValues()
  observeEvent(input$start_input, {
    group_finals$myData <- rhandsontable::hot_to_r(input$ed_out)
    print(group_finals$myData)
  })
  
}

# Run the application
shinyApp(ui = ui, server = server)
  • Related