Условно форматировать пустые ячейки в rHandsontable в Shiny

#r #shiny #rhandsontable

#r #shiny #rhandsontable

Вопрос:

Q1: Я хотел бы изменить формат ячейки rhandsontable в Shiny, когда ее содержимое становится пустым. Я думал, что нашел это с помощью hot_cols(renderer = "...") , но я весьма удивлен результатом: ячейки с содержимым 0 также выделены. Может кто-нибудь сказать мне, как я должен проверять пустоту в JS через R? Я пробовал value === '' и isEmpty() без какого-либо успеха.

Q2: Дополнительно, если мы введем «1e6» в столбец 3, отображаемое значение действительно равно 1000000, но его фон переключится на красный: есть ли способ предотвратить это? т.е. разрешить ввод научной нотации?

Вот минимально воспроизводимый пример:

 library(shiny)
library(rhandsontable)

DF <- data.frame(col1 = c(1, 0, 3), col2 = c(letters[23:22], NA), col3 = round(rnorm(3, 1e6, 1e3),0))

server <- shinyServer(function(input, output, session) {
  
  output$rt <- renderRHandsontable({
    rhandsontable(DF) %>%      
      
      # conditional overall formatting > grey empty cells
      hot_cols(renderer = "
           function (instance, td, row, col, prop, value, cellProperties) {
             Handsontable.renderers.NumericRenderer.apply(this, arguments);
             if(!value) {
                td.style.background = '#EEE';
              }
           }")
  })
})

ui <- shinyUI(fluidPage(
  rHandsontableOutput("rt")
))

shinyApp(ui, server)
  

Ответ №1:

Что касается вашего первого вопроса: вы можете добавить условие, что значение не равно 0:

 library(shiny)
library(rhandsontable)

DF <- data.frame(col1 = c(1, 0, 3), col2 = c(letters[23:22], NA), col3 = round(rnorm(3, 1e6, 1e3),0))

server <- shinyServer(function(input, output, session) {
  
  output$rt <- renderRHandsontable({
    rhandsontable(DF) %>%      
      
      # conditional overall formatting > grey empty cells
      hot_cols(renderer = "
           function (instance, td, row, col, prop, value, cellProperties) {
             Handsontable.renderers.NumericRenderer.apply(this, arguments);
             if(!value amp;amp; value != 0) {
                td.style.background = '#EEE';
              }
           }")
  })
})

ui <- shinyUI(fluidPage(
  rHandsontableOutput("rt")
))

shinyApp(ui, server)
  

Что касается вашего второго вопроса: это известная ошибка, которая была исправлена только в handsontable 6.2.1, но версия CRAN rhandsontable использует handsontable 6.1.1. Версия для разработки, похоже, обновлена до 6.2.2, так что вы можете установить ее из https://github.com/jrowen/rhandsontable

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

1. Я был так уверен, что есть определенный способ протестировать оба одновременно… Я не подумал об этом очевидном решении 🙂 Почему вы используете «amp;amp;», а не просто «amp;»?

2. Я не очень разбираюсь в javascript, но я думаю, что логическое И в JS является amp;amp;