0

我想在闪亮应用程序的表中进行 CRUD(创建、读取、更新和删除)。它完美地更新和删除,但是当我想添加新记录时,它不会在填充文本输入时显示来自滑块的输入。有时它只显示sliderInput 的默认值,当name 的值为NULL 时为2。

ui <- fluidPage(
  #use shiny js to disable the ID field
  shinyjs::useShinyjs(),
  #DT::dataTableOutput("responses"),
  shinyjs::disabled(textInput("id", "Id", "0")),

  textInput("name", "Name", ""),
  checkboxInput("used_shiny", "I've built a Shiny app in R before", FALSE),
  sliderInput("r_num_years", "Number of years using R", 0, 25, 2, ticks = FALSE),

  actionButton("submit", "Submit",icon = icon("plus-circle"),class = "btn-primary"),
  # Delete button 
  actionButton(inputId = "delete", label = "Delete", icon = icon("minus-circle"),class = "btn-primary"),
  #NEW button
  actionButton("new", "Reset",icon = icon("refresh"),class = "btn-primary"),

  box(
    title = "KPIs", status = "primary", solidHeader = TRUE,
    collapsible = TRUE,
    DT::dataTableOutput("responses"), tags$hr()
    )
  )

加载数据和保存数据的方法

UpdateInputs <- function(data, session) {
   updateTextInput(session, "id", value = unname(rownames(data)))
   updateTextInput(session, "name", value = unname(data["name"]))
   updateCheckboxInput(session, "used_shiny", value = as.logical(data["used_shiny"]))
   updateSliderInput(session, "r_num_years", value = as.integer(data["r_num_years"]))
 }
 CastData <- function(data) {
   datar <- data.frame(name = data["name"], 
                       used_shiny = as.logical(data["used_shiny"]), 
                       r_num_years = as.integer(data["r_num_years"]),
                       stringsAsFactors = FALSE)

   rownames(datar) <- data["id"]
   return (datar)
 }

 CreateDefaultRecord <- function() {
   mydefault <- CastData(list(id = "0", name = "", used_shiny = FALSE, r_num_years = 2))
   return (mydefault)
 }


 GetNextId <- function() {
   if (exists("responses") && nrow(responses) > 0) {
     max(as.integer(rownames(responses))) + 1
   } else {
     return (1)
   }
 }

 CreateData <- function(data) {

   data <- CastData(data)
   rownames(data) <- GetNextId()
   if (exists("responses")) {
     responses <<- rbind(responses, data)
   } else {
     responses <<- data
   }
 }

 ReadData <- function() {
   if (exists("responses")) {
     responses
   }
 }

 UpdateData <- function(data) {
   data <- CastData(data)
   responses[row.names(responses) == row.names(data), ] <<- data
 }
 DeleteData <- function(data) {
   responses <<- responses[row.names(responses) != unname(data["id"]), ]
 }

 GetTableMetadata <- function() {
   fields <- c(id = "Id", 
               name = "Name", 
               used_shiny = "Used Shiny", 
               r_num_years = "R Years")

   result <- list(fields = fields)
   return (result)
 }

Server.r 如下:

server <- function(input, output, session) {
  # input fields are treated as a group
  formData <- reactive({
    sapply(names(GetTableMetadata()$fields), function(x) input[[x]])
  })

  # Click "Submit" button -> save data
  observeEvent(input$submit, {
    if (input$id != "0") {
      UpdateData(formData())
    } else {
      CreateData(formData())
      UpdateInputs(CreateDefaultRecord(), session)
    }
  }, priority = 1)

  # Press "New" button -> display empty record
  observeEvent(input$new, {
    UpdateInputs(CreateDefaultRecord(), session)
  })

  # Press "Delete" button -> delete from data
  observeEvent(input$delete, {
    DeleteData(formData())
    UpdateInputs(CreateDefaultRecord(), session)
  }, priority = 1)

  # Select row in table -> show details in inputs
  observeEvent(input$responses_rows_selected, {
    if (length(input$responses_rows_selected) > 0) {
      data <- ReadData()[input$responses_rows_selected, ]
      UpdateInputs(data, session)
    }

  })

  # display table
  output$responses <- DT::renderDataTable(server = FALSE, selection = "single",
                                          colnames = unname(GetTableMetadata()$fields)[-1], {
    #update after submit is clicked
    input$submit
    #update after delete is clicked
    input$delete
    ReadData()
  })
}
shinyApp(ui,server)

我收到的错误消息是:

[<-.factor( , ri, value = 22L)中的警告*tmp*:无效因子水平,生成 NA

4

0 回答 0