Я хочу прочитать все имена столбцов и порядок их отображения в моей таблице данных. Я не могу использовать такие параметры, как «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
)
)
С Рождеством, Шефкоч
Я добавил дополнительную информацию к моему вопросу.
Вот код для 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)
Почему вы хотите использовать JS? У вас есть имена столбцов в R, нет?