r блестящий Rhandsontable: взять источник для выпадающего меню каждой ячейки из списка - PullRequest
0 голосов
/ 03 апреля 2020

Мое блестящее приложение показывает потрясающий. Столбец «бренд» исправлен. Каждая ячейка столбца «память» заполняется на основе фиксированного выпадающего меню. Столбец «цена» доступен для редактирования. Столбец «kpi» показывает результаты бессмысленных вычислений, которые учитывают предыдущие столбцы и флажки в столбце «включить». Это работает, просто запустите его:

library(shiny)
library(shinydashboard)
library(rhandsontable)

# Just initial data for the table:
initial_data <- data.frame(include = c(T, F, T, T, T, F),
                           brand = c(rep("Brand A", 3), rep("Brand B", 3)),
                           memory = c("32GB", "64GB", "128GB", "64GB", "128GB", "256GB"),
                           price = c(520, 620, 720, 600, 700, 800),
                           kpi = rep(NA, 6))

# Random function calculating a meaningless KPI - don't even try to grasp it:
stupid_function <- function(brand, memory, price) {
  brand_numeric <- ifelse(brand == "Brand A", 100, 80)
  memory_numeric <- as.integer(gsub(pattern = "GB", replacement = "", x = memory))
  return(brand_numeric + memory_numeric + price / 100)
}

# ________________________________________________________________________________________
# UI code ####

ui <- fluidPage(rHandsontableOutput("o_my_table"))

# ________________________________________________________________________________________
### SERVER code ####

server <- function(input, output) {

  ### Define my_data as a reactive function:######################
  my_data <- reactive({
    if (is.null(input$o_my_table)) {
      my_data <- initial_data
    } else {
      my_data <- hot_to_r(input$o_my_table)
    }
    my_data$kpi <- stupid_function(my_data$brand, my_data$memory, my_data$price)
    my_data$kpi <- ifelse(my_data$include, my_data$kpi, 0)
    my_data$kpi <- my_data$kpi / sum(my_data$kpi)
    return(my_data)
  })

  ### Define datatable ###########################################
  output$o_my_table <- renderRHandsontable({
    my_data <- my_data()
    rhandsontable(my_data, rowHeaders = F, useTypes = T, formulas = T) %>% 
      hot_col(col = "brand", readOnly = T) %>%
      hot_col(col = "memory", type = "dropdown", source = c("32GB", "64GB", "128GB", "256GB")) %>%
      hot_col(col = "kpi", readOnly = T, format = "0.00%")
  })

}

# ________________________________________________________________________________________
### Return a Shiny app object ####
shinyApp(ui = ui, server = server)

Обратите внимание, что в каждой ячейке столбца «память» выпадающее меню основано на одном векторе: c («32 ГБ», «64 ГБ») , "128 ГБ", "256 ГБ"). Однако я должен изменить это:

Для каждой ячейки в столбце «память» источником выпадающего меню должен быть вектор, расположенный в соответствующем элементе списка ниже (который имеет столько элементов, сколько моя таблица имеет строки). Итак, для верхней ячейки это должен быть первый вектор, а для последней ячейки - последний.

Возможно ли это? Большое вам спасибо!

memory_list <- list(c("32GB", "64GB", "128GB"), 
                    c("32GB", "64GB", "128GB"), 
                    c("32GB", "64GB", "128GB"),
                    c("64GB", "128GB", "256GB"), 
                    c("64GB", "128GB", "256GB"), 
                    c("64GB", "128GB", "256GB"))
...