微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用闪亮在输出数据表中保留编辑过的值

如何解决如何使用闪亮在输出数据表中保留编辑过的值

我正在构建一个闪亮的应用程序来将所有输入变量添加到数据表中。 我还有另一个按钮用于启用第二个 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",)
  )
)

server <- function(input,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,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,server = server)


谢谢。

解决方法

也许您正在寻找 table_cell_editDT 功能。您需要一个 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。