R Shiny: Получение информации из Datatable с помощью JS в Shiny

Я хочу прочитать все имена столбцов и порядок их отображения в моей таблице данных. Я не могу использовать такие параметры, как «stateSave», по разным причинам.

Я не особо разбираюсь в JS, но уверен, что с ним можно это сделать, поэтому мне нужна ваша помощь. Я пробовал такие фрагменты кода, как

datatable(
data,
callback = JS(
              "function(data, type, row, meta) {",
              "  name = data.columns().names();",
              "  Shiny.setInputValue('test', name, {priority: 'event'});",
              "};"
            )
)

но я не работал. Я предполагаю, что это из-за функции? Я действительно не знаю.

Итак, подведем итог: мне нужен блестящий ввод, который показывает мне текущее «состояние столбца» моей таблицы данных, например. имена столбцов и их индекс.

Дополнительная информация, почему я не использую имена столбцов из R:

Я хочу использовать различные расширения DT и другие сценарии JS, которые я нашел в Интернете. Среди прочего я хочу использовать colReorder и функцию для изменения видимости отдельных столбцов. Последнюю функцию я хочу решить с помощью самодельного всплывающего окна и флажков. Они должны быть в том же порядке, что и таблица (после использования colReorder), и должны отображать все столбцы, видимые или нет. Также мне нужно добавлять новые строки и столбцы, поэтому время от времени я перезагружаю свою таблицу. Приблизительные функции не работают для server = TRUE, что мне нужно для других расширений и моего JS-скрипта.

Моя следующая попытка состояла в том, чтобы использовать savestate = TRUE и input$name_state для считывания порядка и видимости, но это не сработало при перезагрузке таблицы.

Итак, мой план состоит в том, чтобы найти JS-скрипт, который дает мне порядок и видимые имена столбцов моей таблицы, чтобы я мог собрать всю информацию для себя.

Вот мои расширения, DT-опции и используемые JS-скрипты:

DT_optionen <- list(
  keys = TRUE,
  dom = "lpt",
  pageLength = "-1",
  lengthMenu = list(c(12, 24, -1), c("1 Jahr", "2 Jahre", "alles")),
  scrollX = TRUE,
  deferRender = TRUE,
  scrollY = 500,
  scroller = TRUE,
  fixedColumns = list(leftColumns = 2),
  colReorder = list(fixedColumnsLeft = 2,
                    realtime = FALSE
  ),
  columnDefs = list(
    list(visible = FALSE, targets = 3),
    list(className = 'dt-right', targets = "_all"),
    list(
      targets = 1,
      render = JS(Datum_sortieren)
    )
  )
)

# With this script you can use the return key 'excel-like' to change values after navigation with the arrow keys
# it only works with server = TRUE
own_JS <- c(
  "table.on('key', function(e, datatable, key, cell, originalEvent){",
  "  var targetName = originalEvent.target.localName;",
  "  if (key == 13 && targetName == 'body'){",
  "    $(cell.node()).trigger('dblclick.dt');",
  "  }",
  "});",
  "table.on('keydown', function(e){",
  "  if (e.target.localName == 'input' && [9,13,37,38,39,40].indexOf(e.keyCode) > -1){",
  "    $(e.target).trigger('blur');",
  "  }",
  "});",
  "table.on('key-focus', function(e, datatable, cell, originalEvent){",
  "  var targetName = originalEvent.target.localName;",
  "  var type = originalEvent.type;",
  "  if (type == 'keydown' && targetName == 'input'){",
  "    if ([9,37,38,39,40].indexOf(originalEvent.keyCode) > -1){",
  "      $(cell.node()).trigger('dblclick.dt');",
  "    }",
  "  }",
  "});"

datatable(
      Ausgaben_anzeige,
      selection = "none",
      editable = TRUE,
      callback = JS(own_JS),
      extensions = c("KeyTable", "FixedColumns", "Scroller", "ColReorder"),
      options = DT_optionen
    )
)

С Рождеством, Шефкоч

Почему вы хотите использовать JS? У вас есть имена столбцов в R, нет?

Stéphane Laurent 24.12.2020 13:43

Я добавил дополнительную информацию к моему вопросу.

Chefkoch 25.12.2020 11:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
671
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот код для rownames = FALSE. Вам придется адаптировать его, если вы используете rownames = TRUE.

library(shiny)
library(DT)

js <- c(
  "table.on('column-reorder', function (e, settings, details) {",
  "  Shiny.setInputValue('order', details.mapping);",
  "});"
)

ui <- fluidPage(
  br(),
  verbatimTextOutput("colnames"),
  br(),
  DTOutput("tbl")
)

server <- function(input, output, session){
  
  output[["tbl"]] <- renderDT({
    datatable(
      iris,
      rownames = FALSE,
      extensions = "ColReorder",
      options = list(
        colReorder = TRUE
      ),
      callback = JS(js)
    )
  })
  
  columnsOrder <- reactiveVal(1:ncol(iris))
  
  observeEvent(input[["order"]], {
    columnsOrder(columnsOrder()[input[["order"]] + 1])
  })
  
  output[["colnames"]] <- renderPrint({
    colnames(iris)[columnsOrder()]
  })
  
}

shinyApp(ui, server)

Другие вопросы по теме