这是一种使用的方法library(sortable)
:
library(shiny)
library(data.table)
library(htmlwidgets)
library(rhandsontable)
library(sortable)
DT <- data.table(A = 1:3, B = 4:6, C = 7:9)
initial_column_names <- names(DT)
inputIds <- paste0("textInput", seq_along(initial_column_names))
labels <- setNames(lapply(seq_along(initial_column_names), function(i){textInput(inputId = inputIds[i], label = "", value = initial_column_names[i], width = NULL, placeholder = NULL)}), inputIds)
column_rank_list <- rank_list(
text = "Reorder / rename columns",
labels = labels,
input_id = "column_rank_list"
)
ui <- fluidPage(
fluidRow(column(width = 3, column_rank_list),
column(width = 9, rHandsontableOutput('preview_table')))
)
server <- function(input, output, session) {
rv_data <- reactiveVal(DT)
# Change columns' order
observeEvent(input$column_rank_list, {
req(input$column_rank_list)
tmpDT <- copy(rv_data())
column_order <- sapply(input$column_rank_list, function(x){input[[x]]})
setcolorder(tmpDT, column_order)
rv_data(tmpDT)
})
# Change column names
observeEvent(sapply(inputIds, function(x){input[[x]]}), {
req(input$column_rank_list)
tmpDT <- copy(rv_data())
column_order <- sapply(input$column_rank_list, function(x){input[[x]]})
setnames(tmpDT, column_order)
rv_data(tmpDT)
})
# Preview table
output$preview_table <- renderRHandsontable({
rhandsontable(
data = rv_data(),
readOnly = TRUE,
contextMenu = FALSE,
selectionMode = 'none'
)
})
}
shinyApp(ui, server)
请检查this https://stackoverflow.com/questions/73504019/shiny-horizontal-sortable-rank-list如果您喜欢水平布局。