В блестящем Как создать таблицу DT, где я могу добавлять строки и удалять строки одновременно

sujith kumar спросил: 31 июля 2018 в 09:31 в: shiny

Я пробовал это по-разному и добился одной задачи: либо добавить, либо удалить., но я не смог получить полное решение в одном, возможно, я пропустил какую-то небольшую концепцию. Я добавляю код, пожалуйста, помогите я завершаю основное приложение.

library(shiny)
library(DT)
x<- data.frame(v1 = NA,
         v2 = NA),
ui = shinyUI(
 fluidPage(
  sidebarLayout(
    sidebarPanel(
      textInput("v1","v1","a"),
      numericInput("V2","V2","1"),
      # Row selection
      numericInput(inputId = "row.selection", label = "Select row to be 
 deleted", min = 1, max = 100, value = "")
      # Add button
      actionButton(inputId = "add.button", label = "Add", icon = 
 icon("plus")), 
      # Delete button 
      actionButton(inputId = "delete.button", label = "Delete", icon = 
 icon("minus")),    ),
    mainPanel(
      dataTableOutput('table')
    )
  )
 )
),

Код сервера

server = function(input, output, session) {
  values <- reactiveValues()
  values$df <- x  newEntry <- observe({
    cat("newEntry\n")
    if(input$add.button > 0) {
      newRow <- data.frame(input$v1, input$v2)
      isolate(values$df <- rbind(values$df,newRow))
   }
  })  deleteEntry <- observe({
   cat("deleteEntry\n")
   if(input$delete.button > 0) {
     if(is.na(isolate(input$row.selection))){
       values$df <- isolate(values$df[-nrow(values$df), ])
     } else {
       values$df <- isolate(values$df[-input$row.selection, ])
     }
   }   })  output$table = renderDataTable({
    values$df   })}

1 ответ

Есть решение
Jim Chen ответил: 31 июля 2018 в 06:27

Попробуйте использовать наблюдаемое событие вместо наблюдения с помощью кнопки действия; кроме того, у вас есть проблема с прописными и строчными буквами при вводе $ v2 (должен быть введен $ V2) Попробуйте этот модифицированный код:

library(shiny)
library(DT)
x<- data.frame(v1 = NA,
               v2 = NA)
ui = shinyUI(
  fluidPage(
    sidebarLayout(
      sidebarPanel(
        textInput("v1","v1","a"),
        numericInput("V2","V2","1"),
        # Row selection
        numericInput(inputId = "row.selection", label = "Select row to be 
                     deleted", min = 1, max = 100, value = ""),
        # Add button
        actionButton(inputId = "add.button", label = "Add", icon = 
                       icon("plus")), 
        # Delete button 
        actionButton(inputId = "delete.button", label = "Delete", icon = 
                       icon("minus"))        ),
      mainPanel(
        dataTableOutput('table')
      )
    )
  )
)
server = function(input, output, session) {
  values <- reactiveValues()
  values$df <- x  observeEvent(input$add.button,{
    cat("addEntry\n")
    print(input$v1)
    print(input$V2)
    newRow <- data.frame(input$v1, input$V2)
    colnames(newRow)<-colnames(values$df)
    values$df <- rbind(values$df,newRow)
    print(nrow(values$df))
  })  observeEvent(input$delete.button,{
    cat("deleteEntry\n")
    if(is.na(input$row.selection)){
      values$df <- values$df[-nrow(values$df), ]
    } else {
      values$df <- values$df[-input$row.selection, ]
    }
  })    output$table = renderDataTable({
    values$df 
  })}
shinyApp(ui,server)

Просто запустите весь приведенный выше код, и он должен работать правильно.

sujith kumar ответил: 02 августа 2018 в 03:10
Спасибо Jimchem за его работу, я также тщательно изучу различия между наблюдением и наблюдением. И я вижу в моем наборе данных есть одна пустая строка (первая строка). Где я должен удалить это, но как мы можем получить это без пустой строки.
Jim Chen ответил: 02 августа 2018 в 12:41
Попробуйте функцию na.omit, которая может удалить элемент или строку NA.
sujith kumar ответил: 02 августа 2018 в 12:54
Да, na.omit () работает, но серийный номер данных начинается с 2,3, ..., есть ли другой способ поработать над этим.
Jim Chen ответил: 03 августа 2018 в 06:13
Попробуйте это: значения $ df < -na.omit (значения $ df) имена строк (значения $ df) < -1: nrow (значения $ df) return (значения $ df)