闪亮的 rhandsontable 自动值取决于用户

Shiny rhandsontable automatic values depending on User

我有一个 table,用户将在其中输入一些组。因此,我希望另一列自动更新并显示每个组的频率(或重复):

此代码创建此应用程序:

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)

所以想法是用户输入组,然后自动更新复制:(这里用户输入 B, B, A, A, B

我可以计算每个组的重复次数,但我不确定在用户输入每个组后,如何实现这部分来计算它们并同时显示它们。

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

不确定这是否是最好的方法,我尝试使用 hot_to_col renderer 来使用 javascript 但我不熟悉那种语言。

抱歉,我不熟悉 tidyverse - 所以我切换到 data.table

hot_to_r才是正确的做法:

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)