R: как раскрасить отдельные ячейки в таблице rhandsontable

#r #renderer #rhandsontable

Вопрос:

У меня есть фреймы данных (color_cells), содержащие количество столбцов и строк в ячейках фрейма данных, которые должны быть окрашены в таблицу rand. Как я могу передать эту информацию визуализатору в renderRHandsontable?

 library(shiny)
library(rhandsontable)

ui <- fluidPage(
  rHandsontableOutput('hot')
)

server <- function(input, output, session) {
  
  color_cells <<- data.frame(col=c(1,2,3),row=c(2,4,5))
  
  output$hot <- renderRHandsontable({
    rhandsontable(mtcars, readOnly = TRUE, width = 750, height = 300) %>%
      hot_cols(renderer = myrenderer)
  })
  
  
  myrenderer <- "function (instance, td, row, col, prop, value, cellProperties) {

  Handsontable.renderers.TextRenderer.apply(this, arguments);

  for ( i in 1:length(color_cells$row) ) {
    r <- color_cells[i,'row']
    c <- color_cells[i,'col']
    if (col == c amp; row == r ) {  
      td.style.background = 'pink';
      }
    }
  }"
}

shinyApp(ui = ui, server = server)
 

Ответ №1:

Вот что нужно попробовать — дайте мне знать, если это сработает.

При вызове rhandsontable включите два пользовательских параметра, которые будут содержать векторы, представляющие столбцы и строки для выделения color_cells .

В вашем пользовательском средстве визуализации создайте массивы из этих двух векторов, хранящихся в парах. Затем вы можете установить цвет фона, если столбец и строка соответствуют параметрам.

 server <- function(input, output, session) {
  
  color_cells <<- data.frame(col=c(1,2,3),row=c(2,4,5))
  
  output$hot <- renderRHandsontable({
    rhandsontable(mtcars, 
                  col_highlight = color_cells$col - 1,
                  row_highlight = color_cells$row - 1,
                  readOnly = TRUE, 
                  width = 750, 
                  height = 300) %>%
      hot_cols(renderer = myrenderer)
  })

  myrenderer <- "function(instance, td, row, col, prop, value, cellProperties) {
                Handsontable.renderers.TextRenderer.apply(this, arguments);
                if (instance.params) {
                    hcols = instance.params.col_highlight
                    hcols = hcols instanceof Array ? hcols : [hcols]
                    hrows = instance.params.row_highlight
                    hrows = hrows instanceof Array ? hrows : [hrows]
                    
                    for (i = 0; i < hcols.length; i  ) { 
                        if (hcols[i] == col amp;amp; hrows[i] == row) {
                            td.style.background = 'pink';
                        }
                    }
                }
  }"      
}
 

Комментарии:

1. Большое спасибо, Бен. Это поможет!

2. Отлично! Не стесняйтесь принимать ответ, если это уместно.