R Shiny DataTables заменяет числовые значения на строку и сортирует их как меньшие, чем числовые значения

В приложении Shiny у меня есть столбец чисел в datatable, где по соображениям безопасности некоторые значения были подавлены, и мы хотим заменить их определенной строкой, которую здесь я назову "my_string". При сортировке по этому столбцу эти подавленные значения необходимо отсортировать так, как если бы они меньше всех фактических чисел. В этом столбце все значения положительные, за исключением подавленных значений, которые были закодированы как -1.

Я пробовал перекодировать -1 как "my_string" (который приводит столбец к character) и использовать плагин natural -in, чтобы правильно отсортировать числовые значения с символьной кодировкой, но "my_string" сортируется так, как будто оно больше всех числовых значений.

Другой возможный способ справиться с этим - использовать обратный вызов JavaScript для замены -1 строкой, но я не знаю, как написать этот сценарий и правильно добавить его в datatable.

Вот моя попытка использовать плагин natural. Если бы он работал так, как я хочу, строка с «my_string» была бы внизу списка, а не вверху.

# Example data, representing how the data comes to me
my_mtcars <- mtcars[1:6, 1:4]
my_mtcars[1, 4] <- -1

# Here I am recoding the -1
my_mtcars[my_mtcars == -1] <- 'my_string'

# This is our demo app.R
library(shiny)
library(DT)

ui <- fluidPage(
  dataTableOutput('example')
)

server <- function(input, output) {
  output$example <- renderDataTable(
    my_mtcars,
    server = FALSE,
    plugins = 'natural',
    options = list(columnDefs = list(list(type = 'natural', targets = '_all')))
  )
}

shinyApp(ui = ui, server = server)

введите здесь описание изображения


person Brian Stamper    schedule 11.10.2017    source источник


Ответы (1)


Это, вероятно, проще с пользовательской функцией форматирования / рендеринга столбцов.

См. Раздел «Отображение столбца» в документации DT: https://rstudio.github.io/DT/options.html

И документы DataTables: https://datatables.net/reference/option/columns.render

my_mtcars <- mtcars[1:6, 1:4]
my_mtcars[1, 4] <- -1

formatSuppressedValues <- JS("
  function(data, type) {
    if (type !== 'display') return data;
    if (data !== -1) return data;
    return 'my_string';
  }
")

library(shiny)
library(DT)

ui <- fluidPage(
  DT::dataTableOutput('example')
)

server <- function(input, output) {
  output$example <- DT::renderDataTable(
    my_mtcars,
    server = FALSE,
    options = list(
      columnDefs = list(list(
        targets = '_all',
        render = formatSuppressedValues
      ))
    )
  )
}

shinyApp(ui = ui, server = server)
person greg L    schedule 12.10.2017
comment
Отлично спасибо! Также очень полезно увидеть, как общая документация по таблицам данных отображается в контексте R DT. Примечание для будущих посетителей - я включил server = FALSE в свой пример только потому, что этого требует плагин natural, на самом деле он не нужен для этого решения. - person Brian Stamper; 12.10.2017