#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