Как интерактивно вставлять (и удалять) редактируемые строки и столбцы в таблицу данных, отображаемую с помощью пакета DT в R Shiny?

#r #shiny #dt

Вопрос:

В приведенном ниже коде MWE, как мне изменить его, чтобы позволить пользователю вставлять новые строки или столбцы или удалять указанные строки или столбцы из таблицы, отображаемой с помощью пакета DT?

Приведенное ниже уже позволяет пользователю редактировать поля, нажимая на них. Далее, чтобы сделать это еще более интерактивным, я бы хотел, чтобы пользователь мог добавлять/удалять строки и столбцы. Любые добавленные столбцы или строки будут доступны для редактирования так же, как и текущие поля.

Изображения внизу помогают проиллюстрировать то, что я пытаюсь сделать.

Сюжет в том виде, в каком он был составлен, еще не готов на 100%. В конечном счете у меня будет отдельная строка для каждого столбца в таблице.

Код MWE:

 library(shiny)
library(DT)
library(tidyverse)

  ui <- fluidPage(
  titlePanel("Editable Dataframe and Plot"),
  sidebarLayout(
    sidebarPanel(
      DTOutput("my_datatable"),
      h5(strong("Add/delete row/column by name:")),
      fluidRow(
        tags$head(tags$style(
           type= "text/css",
                "label{display:table-cell;
                 text-align:center;
                 vertical-align:middle;}.form-group{display:table-row;}"
            ) # close tags style
          ), # close tags head
        textInput('Row','Row >'),
        textInput('Col','Column >')
        ), # close fluid row
      br(),
      actionButton("addBtn", "Add"),
      actionButton("removeBtn","Remove"),
      actionButton("plotData",label = "Plot")
    ), # close sidebar panel
    
    # Show plot
    mainPanel(plotOutput("my_plot"))
    
  ) # close sidebar layout
) # close fluid page

server <- function(input, output) {
  v <- reactiveValues(data = { 
    data.frame(x = numeric(0),y = numeric(0)) %>% 
      add_row(x = rep(0,10),y = rep(0,10))
  }) # close reactive values
  
  output$my_datatable <- renderDT({
    DT::datatable(v$data, editable = TRUE, options = list(dom = 'ltipr'))
  }) # close render DT

  observeEvent(input$my_datatable_cell_edit, {
    info = input$my_datatable_cell_edit
    i = as.numeric(info$row)
    j = as.numeric(info$col)
    k = as.numeric(info$value)
    if(k < 0){k <- k * -1} # Convert to positive if negative
    v$data[i,j] <- k
  }) # close observe event
  
  # Render plot
  output$my_plot <- renderPlot({
    req(input$plotData) # Require the input button to be non-0 (ie: don't load the plot when the app first loads)
    isolate(v$data) %>%  # Don't react to any changes in the data
      ggplot(aes(x,y))  
      geom_line()
  }) # close render plot
} # close server

shinyApp(ui = ui, server = server)
 

На первом изображении показано, что отображается при вызове приложения.
Второе изображение является примером удаления пользователем строки.
Третье изображение-пример того, как пользователь вставляет столбец.

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

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

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

Комментарии:

1. Не изобретайте велосипед заново: blog.rstudio.com/2018/03/29/dt-0-4