首页 > 解决方案 > 从 reactiveValue 列表填充数据表

问题描述

我希望根据从 reactiveValues 列表中获得的值将行添加到数据表中。我这个例子是基于之前的一篇文章

理想的工作流程如下: 1. 在表中
选择“添加” 2. 验证“名称”/“动机”组合是否尚未被选择3.使用“删除”选项按钮 添加行 4. “删除”按钮将从表中删除行并重新生成df

dfout

我目前遇到的问题是dfout使用 reactiveValues 列表自动填充表格。我相信这是因为 reactiveValue 表不能作为输入 reactiveValue 列表。

library(shiny)
library(DT)
library(purrr)

shinyApp(
  ui <- fluidPage(
    DT::dataTableOutput("data"),
    DT::dataTableOutput("dfoutput")
  ),

  server <- function(input, output) {

    name_mot <-reactiveValues(l = c())


    shinyInput <- function(FUN, len, id, ...) {
      inputs <- character(len)
      for (i in seq_len(len)) {
        inputs[i] <- as.character(FUN(paste0(id, i), ...))
      }
      inputs
    }

    df <- reactiveValues(data = data.frame(
      Name = c('Dilbert', 'Alice', 'Wally', 'Ashok', 'Dogbert'),
      Motivation = c(62, 73, 3, 99, 52),
      Add = shinyInput(actionButton, 5, 'button_', label = "+",  onclick = 'Shiny.onInputChange(\"add_button\",  this.id)' ),
      stringsAsFactors = FALSE,
      row.names = 1:5
    ))


    output$data <- DT::renderDataTable(
      df$data, server = FALSE, escape = FALSE, selection = 'none'
    )

    observeEvent(input$add_button, {
      selectedRow <- as.numeric(strsplit(input$add_button, "_")[[1]][2])
      toaddstring = paste(df$data[selectedRow,"Name"],df$data[selectedRow,"Motivation"],sep=":")
      if(!toaddstring %in% name_mot$l){
        name_mot$l = c(name_mot$l, toaddstring)
      }
      })

    #dfout <- reactiveValues(data = data.frame(
    #  Name = str_split(name_mot$l, ":") %>% map_chr(`[`, 1),
    #  Motivation = str_split(name_mot$l, ":") %>% map_chr(`[`, 2),
    #  shinyInput(actionButton, 1, 'button_', label = "-",  onclick = 'Shiny.onInputChange(\"remove_button\",  this.id)' ),
    #  stringsAsFactors = FALSE
    #))

 # output$dfoutput <- DT::renderDataTable(
 #  dfout$data, server = FALSE, escape = FALSE, selection = 'none'
 #   )

  }
)

标签: rdatatableshiny

解决方案


推荐阅读