【问题标题】:How to keep edited values in an output datatable using shiny如何使用闪亮将编辑的值保留在输出数据表中
【发布时间】:2021-06-20 17:05:38
【问题描述】:

我正在构建一个闪亮的应用程序来将所有输入变量添加到数据表中。 我还有另一个按钮用于启用第二个 tabPanel 并显示可编辑的数据表。 我想在第二个 tabPanel 中编辑表格并更新数据表。因此,当我继续添加更多值时,它可以保留已完成的更新。

library("shiny")
library("dplyr")
library("DT")

ui <- fluidPage(
  tabsetPanel(
    id = "idTabset",
    tabPanel(
      value = "input_data",
      title = "Inpute Data",
      textInput(inputId   = 'item1', label = 'Item 1'),
      textInput(inputId   = 'item2', label = 'Item 2'),
      actionButton('save_data', 'Add'),
      actionButton('review_data', 'Save and Review')
    ),
    tabPanel(
      value = "input_tbl",
      title = "Raw Data",
      DT::dataTableOutput('output_tbl'),
      actionButton('submit_tbl', 'Upload')
    )
  )
)

server <- function(input, output, session) {
  hideTab(inputId = "idTabset", target = "input_tbl")
  
  user_tbl <- tibble(`Item 1` = as.character(),
                     `Item 2` = as.character())
  
  user_data <- reactive({
    tibble(`Item 1` = as.character(input$item1),
           `Item 2` = as.character(input$item2))
  })
  
  observeEvent(input$save_data, {
    user_tbl <<- user_tbl %>%
      bind_rows(user_data())
    
    output$output_tbl = DT::renderDataTable({
      DT::datatable(user_tbl, editable = TRUE)
      
    })
    
    sapply(c('item1','item2'),
           function(x) {updateTextInput(session, x, value = "")})
  })
  
  observeEvent(input$review_data, {
    showTab(inputId = "idTabset", target = "input_tbl")
  })
  
}

shinyApp(ui = ui, server = server)

有人知道如何保存更新的值吗?

更新:感谢@YBS

我也在外面创建user_tbl,所以我不需要使用reactiveValues 来分配结果。

library("shiny")
library("dplyr")
library("DT")

user_tbl <- data.frame(`Item 1` = as.character(),
                   `Item 2` = as.character(),
                   stringsAsFactors = FALSE)

ui <- fluidPage(
  tabsetPanel(
    id = "idTabset",
    tabPanel(
      value = "input_data",
      title = "Inpute Data",
      textInput(inputId   = 'item1', label = 'Item 1'),
      textInput(inputId   = 'item2', label = 'Item 2'),
      actionButton('save_data', 'Add'),
      actionButton('review_data', 'Save and Review')
    ),
    tabPanel(
      value = "input_tbl",
      title = "Raw Data",
      DT::dataTableOutput('output_tbl'),
    )
  )
)

server <- function(input, output, session) {
  hideTab(inputId = "idTabset", target = "input_tbl")
  
  user_data <- reactive({
    data.frame(`Item 1` = as.character(input$item1),
           `Item 2` = as.character(input$item2),
           stringsAsFactors = FALSE)
  })
  
  observeEvent(input$save_data, {
    user_tbl <<- user_tbl %>%
      bind_rows(user_data())
    
    output$output_tbl <- DT::renderDataTable({
      DT::datatable(user_tbl, editable = TRUE)
      
    })
    
    sapply(c('item1','item2'), function(x) {updateTextInput(session, x, value = "")})
  })
  
  observeEvent(input$output_tbl_cell_edit, {
    info = input$output_tbl_cell_edit
    i = info$row
    j = info$col
    v = info$value
    user_tbl[i, j] <<- DT::coerceValue(v, user_tbl[i, j])
    
  })
  
  observeEvent(input$review_data, {
    showTab(inputId = "idTabset", target = "input_tbl")
  })
  
}

shinyApp(ui = ui, server = server)


谢谢。

【问题讨论】:

  • 请考虑发布MRE,以便有人可以帮助您。
  • 我已经删除了不必要的代码,希望是 MRE。

标签: r shiny shinydashboard


【解决方案1】:

也许您正在寻找DTtable_cell_edit 功能。您需要一个reactiveValues 对象来跟踪tab1 和tab2 中的更改。试试这个

library("shiny")
library("dplyr")
library("DT")

ui <- fluidPage(
  tabsetPanel(
    id = "idTabset",
    tabPanel(
      value = "input_data",
      title = "Inpute Data",
      textInput(inputId   = 'item1', label = 'Item 1'),
      textInput(inputId   = 'item2', label = 'Item 2'),
      actionButton('save_data', 'Add'),
      actionButton('review_data', 'Save and Review')
    ),
    tabPanel(
      value = "input_tbl",
      title = "Raw Data",
      DT::dataTableOutput('output_tbl'),
      actionButton('submit_tbl', 'Upload')
    )
  )
)

server <- function(input, output, session) {
  hideTab(inputId = "idTabset", target = "input_tbl")
  
  user_tbl <- tibble(`Item 1` = as.character(),
                     `Item 2` = as.character())
  
  rv <- reactiveValues(data=user_tbl)
  
  user_data <- reactive({
    tibble(`Item 1` = as.character(input$item1),
           `Item 2` = as.character(input$item2))
  })
  
  observeEvent(input$save_data, {
    rv$data <<- rv$data %>%
      bind_rows(user_data())
    output$output_tbl = DT::renderDataTable({
      DT::datatable(rv$data, editable = TRUE)
      
    })
    
    sapply(c('item1','item2'),
           function(x) {updateTextInput(session, x, value = "")})
  })
  
  observeEvent(input$output_tbl_cell_edit, {
    info = input$output_tbl_cell_edit
    str(info)
    i = info$row
    j = info$col
    v = info$value

    rv$data[i, j] <<- DT::coerceValue(v, rv$data[i, j])

  })
  
  observeEvent(input$review_data, {
    showTab(inputId = "idTabset", target = "input_tbl")
  })
  
}

shinyApp(ui = ui, server = server)

【讨论】:

  • 那行得通。而不是使用rv &lt;- reactiveValues(data=user_tbl),我可以在外部创建该数据,并且它的工作方式相同。感谢您让我知道 table_cell_edit 功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 2020-11-05
  • 1970-01-01
  • 2019-08-01
  • 2015-03-05
  • 2021-08-19
  • 2020-12-24
相关资源
最近更新 更多