Чтобы получить кнопки с двойными стрелками, вы можете использовать:
actionButton("add_all", label = NULL, icon("angle-double-right"),
lib = "font-awesome")
Обратите внимание, что ?icon
ссылается на страницу fontawesome, на которой есть значки с двумя стрелками: https://fontawesome.com/icons?d=gallery&q=double%20arrow&m=free.
Чтобы удалить все элементы, вы можете просто переключиться в состояние по умолчанию:
observeEvent(input$remove_all, {
mem$selected <- select_init
mem$pool <- pool_init
})
где состояние по умолчанию было определено как:
pool_init <- data.frame(data = LETTERS[1:10])
select_init <- data.frame(data = "")
Чтобы добавить все строки, вы можете просто переключить состояния:
mem$selected <- pool_init
mem$pool <- select_init
Обратите внимание, что я использую (почти) пустой data.frame, чтобы гарантировать, что datatable отображается, даже если он пуст. Это не очень элегантно, поскольку в нем есть пустая строка. Для этого могут быть лучшие способы. Например. если вы добавите строку и снова отмените выбор, чтобы таблица была пустой, отображается No data available in table
. Так выглядит лучше.
Полный воспроизводимый пример:
library(shiny)
library(DT)
ui <- fluidPage(
br(),
splitLayout(cellWidths = c("40%", "10%", "40%", "10%"),
DTOutput("pool"),
list(
br(),br(),br(),br(),br(),br(),br(),
actionButton("add", label = NULL, icon("arrow-right")),
br(),br(),
actionButton("remove", label = NULL, icon("arrow-left"))
),
DTOutput("selected"),
list(
br(),br(),br(),br(),br(),br(),br(),
actionButton("add_all", label = NULL, icon("angle-double-right"),
lib = "font-awesome"),
br(),br(),
actionButton("remove_all", label = NULL, icon("angle-double-left"),
lib = "font-awesome")
)
)
)
pool_init <- data.frame(data = LETTERS[1:10])
select_init <- data.frame(data = "")
server <- function(input, output, session) {
mem <- reactiveValues(
pool = pool_init, selected = select_init
)
observeEvent(input$add, {
req(input$pool_rows_selected)
mem$selected <- rbind(isolate(mem$selected), mem$pool[input$pool_rows_selected, , drop = F])
mem$selected <- mem$selected[sapply(mem$selected, nchar) > 0, , drop = FALSE]
mem$pool <- isolate(mem$pool[-input$pool_rows_selected, , drop = F])
})
observeEvent(input$remove, {
req(input$selected_rows_selected)
mem$pool <- rbind(isolate(mem$pool), mem$selected[input$selected_rows_selected, , drop = F])
mem$pool <- mem$pool[sapply(mem$pool, nchar) > 0, , drop = FALSE]
mem$selected <- isolate(mem$selected[-input$selected_rows_selected, , drop = F])
})
observeEvent(input$add_all, {
mem$selected <- pool_init
mem$pool <- data.frame(data = "")
})
observeEvent(input$remove_all, {
mem$selected <- select_init
mem$pool <- pool_init
})
output$pool <- renderDT({
mem$pool
})
output$selected <- renderDT({
mem$selected
})
}
shinyApp(ui, server)
Что касается требований к нескольким таблицам, см. Мой комментарий.
person
Tonio Liebrand
schedule
13.07.2020