r handsontable: может ли пользовательский рендер отменить команды форматирования столбцов? - PullRequest
0 голосов
/ 03 октября 2019

Этот рендеринг моего rhandsontable в Shiny работает просто отлично. Помимо прочего, колонны "Пат. Owes 'и' Ins. Отображение Owes в формате US $ (см. Строки 4 и 5 в нижней части раздела кода ниже):

renderRHandsontable({
      sessions_reactive$sessions[[patient_nr]], 
      row_highlight = row_highlight, col_highlight = col_highlight,
      width = 1000, height = 500) %>% 
      hot_rows(fixedRowsTop = 1) %>%
      hot_col("Pat. Owes", format = "$0,000.00", language = "en-US") %>%
      hot_col("Ins. Owes", format = "$0,000.00", language = "en-US") %>% 
      hot_table(highlightCol = TRUE, highlightRow = TRUE) %>% 
      hot_validate_numeric(cols = c(3, 5), min = 0, max = 500) %>% 
      hot_col(c(1, 3, 5, 6, 8), valign = 'htCenter')
})

Приведенный ниже код, но с закомментированными двумя строками в формате US $, также закомментированработает отлично. Рендерер внизу выполняет 2 действия: делает шрифт жирным и красным в столбцах 5 и 8. Кроме того, фон всей строки становится желтым, если в последнем столбце содержится определенная строка.

    rhandsontable(
      sessions_reactive$sessions[[patient_nr]], 
      row_highlight = row_highlight, col_highlight = col_highlight,
      width = 1000, height = 500) %>% 
      hot_rows(fixedRowsTop = 1) %>%
    # hot_col("Pat. Owes", format = "$0,000.00", language = "en-US") %>%
    # hot_col("Ins. Owes", format = "$0,000.00", language = "en-US") %>% 
      hot_table(highlightCol = TRUE, highlightRow = TRUE) %>% 
      hot_validate_numeric(cols = c(3, 5), min = 0, max = 500) %>% 
      hot_col(c(1, 3, 5, 6, 8), valign = 'htCenter') %>%
      hot_cols(renderer = "
            function (instance, td, row, col, prop, value, cellProperties) {
                     Handsontable.renderers.TextRenderer.apply(this, arguments);

                     if (instance.params) {
                       hrows = instance.params.row_highlight
                       hrows = hrows instanceof Array ? hrows : [hrows]
                       hcols = instance.params.col_highlight
                       hcols = hcols instanceof Array ? hcols : [hcols]

                       if (hrows.includes(row)) {
                         td.style.background = 'yellow'
                       }

                       if (hcols.includes(col)) {
                         td.style.fontWeight = 'bold'
                         td.style.color = '#fc0f03'
                       }
                     }
            }")
  })

Моя проблема: если я раскомментирую 2 прокомментированные строки hot_col, посвященные форматированию в долларах - они не будут работать в сочетании с моим рендерером внизу. Я имею в виду, что ошибки нет, но эти 2 столбца просто не отображаются в формате US $ - они просто отображаются в числовом формате. Понятно, что мой рендерер внизу (хотя он и не ссылается на эти столбцы) как-то отрицает форматирование в долларах США. Перемещение этих двух строк внизу определения не помогает. Рендеринг работает, но форматирование в долларах США не работает.

Есть совет? Большое спасибо!

1 Ответ

1 голос
/ 04 октября 2019

будет использовать NumericRenderer вместо TextRenderer. Насколько я понимаю, TextRenderer по умолчанию без проверки. NumericRenderer может помочь с форматированием чисел.

Вот предыдущий пример (с форматированием строк и столбцов), с добавлением hot_col с указанием форматирования в долларах США:

library(shiny)
library(rhandsontable)

DF = data.frame(a=1:10, b=3:12, c=c("Dog", "Cat", "Mouse", 5:11), d=3:12, e=1:10, f=1:10, g=1:10, h=2:11, Comments = c("missed etc", rep("", 7), "missed", ""))

ui <- fluidPage(
  mainPanel(
    rHandsontableOutput('table')
  )
)

server = function(input, output, session) {

  output$table <- renderRHandsontable({
    row_highlight = which(grepl("missed", DF$Comments))-1
    col_highlight = c(5,8)-1
    rhandsontable(DF, row_highlight = row_highlight, col_highlight = col_highlight, width = 550, height = 300) %>%
      hot_rows(fixedRowsTop = 1) %>%
      hot_col(1, format = "$0,000.00", language = "en-US") %>%
      hot_col(2, format = "$0,000.00", language = "en-US") %>% 
      hot_table(highlightCol = TRUE, highlightRow = TRUE) %>% 
      hot_validate_numeric(cols = c(3, 5), min = 0, max = 500) %>% 
      hot_col(c(1, 3, 5, 6, 8), valign = 'htCenter') %>%
      hot_cols(renderer = "
            function (instance, td, row, col, prop, value, cellProperties) {
                     Handsontable.renderers.NumericRenderer.apply(this, arguments);

                     if (instance.params) {
                       hrows = instance.params.row_highlight
                       hrows = hrows instanceof Array ? hrows : [hrows]
                       hcols = instance.params.col_highlight
                       hcols = hcols instanceof Array ? hcols : [hcols]

                       if (hrows.includes(row)) {
                         td.style.background = 'yellow' 
                       }

                       if (hcols.includes(col)) {
                         td.style.fontWeight = 'bold'
                         td.style.color = '#fc0f03'
                       }
                     }
            }"
      ) 
  })
}

shinyApp(ui, server)
...