访问reactiveValuesToList中的reactiveValues

时间:2017-03-30 03:27:25

标签: r shiny reactive

我不想指定单独的fileInput变量,而是使用reactiveValues来存储上传的CSV数据框,以某种方式操作它们,然后将它们存储起来以便以后加入。我的设计是按文件名命名每个数据框,并附加到reactiveValue rvTL。我的问题是,

  • 如何使用reactiveValuesToList(rvTL)
  • 创建我创建的列表下的各个数据框
  • 下一步,如何创建selectInput菜单以访问fileInput
  • 上传的各个数据框

为了学习这个概念,我正在摒弃Dean Attali的答案,并将rvTL与他的values变量相同。 R shiny: How to get an reactive data frame updated each time pressing an actionButton without creating a new reactive data frame?

我在reactiveValues上查了很多示例代码,但仍然不完全了解。大多数示例都在reactiveValuesToList(input) R Shiny: Keep/retain values of reactive inputs after modifying selection上使用了一些排序变体,我真的没有看到这里的逻辑。任何帮助/建议将不胜感激!

library(shiny)
runApp(shinyApp(
  ui=(fluidPage(
    titlePanel("amend data frame"),

    mainPanel(
      fileInput("file", "Upload file", multiple=T),
      tabsetPanel(type="tabs",
          tabPanel("tab1",        
                    numericInput("Delete", "Delete row:", 1, step = 1),
                    actionButton("Go", "Delete!"),
                    verbatimTextOutput("df_data_files"),
                    verbatimTextOutput("values"),
                    verbatimTextOutput("rvTL"),
                   tableOutput("rvTL_out")
          ),
          tabPanel("tab2", 
                  tableOutput("df_data_out")
          )
    )))),

  server = (function(input, output) {
    values <- reactiveValues(df_data = NULL) ##reactiveValues
    rvTL <- reactiveValues(rvTL = NULL)

    observeEvent(input$file, {
      values$df_data <- read.csv(input$file$datapath)
      rvTL[[input$file$name]] <- c(isolate(rvTL), read.csv(input$file$datapath))
    })

    observeEvent(input$Go, {
      temp <- values$df_data[-input$Delete, ]
      values$df_data <- temp
    })

    output$df_data_files <- renderPrint(input$file$name)
    output$values <- renderPrint(names(values))
    output$rvTL <- renderPrint(names(reactiveValuesToList(rvTL))[1] )
    output$rvTL_out <- renderTable(reactiveValuesToList(rvTL)[[1]])
    output$df_data_out <- renderTable(values$df_data)

    })
  ))

1 个答案:

答案 0 :(得分:3)

这真的和你想象的一样简单。你也很亲密,只是陷入了一些语法陷阱。我做了以下更改:

  • c(isolate(..电话搞砸了,我摆脱了它。这导致了"Warning: Error in as.data.frame.default: cannot coerce class "c("ReactiveValues", "R6")" to a data.frame"个错误。
  • 此外,您经常重复使用rvTL这个名称令人困惑并且可能导致冲突,所以我重命名了其中几个。
  • 我还添加了一个加载的文件名列表(lfnamelist)来跟踪加载的内容。我本来可以使用names(rvTL$dflist),但当时我没有想到 - 而且我也是一个如何将相关的反应值组织成一个声明的有用示例。
  • 然后我添加了渲染selectInput,以便您可以检查在reactiveValue列表中保存的内容。

所以这是经过调整的代码:

library(shiny)
runApp(shinyApp(
  ui=(fluidPage(
    titlePanel("amend data frame"),

    mainPanel(
      fileInput("file", "Upload file", multiple=T),
      tabsetPanel(type="tabs",
                  tabPanel("rvTL tab",        
                           numericInput("Delete", "Delete row:", 1, step = 1),
                           uiOutput("filesloaded"),
                           actionButton("Go", "Delete!"),
                           verbatimTextOutput("df_data_files"),
                           verbatimTextOutput("values"),
                           verbatimTextOutput("rvTL_names"),
                           tableOutput("rvTL_out")
                  ),
                  tabPanel("values tab", 
                           tableOutput("df_data_out")
                  )
      )))),

  server = (function(input, output) {
    values <- reactiveValues(df_data = NULL) ##reactiveValues
    rvTL <- reactiveValues(dflist=NULL,lfnamelist=NULL)

    observeEvent(input$file, {
      req(input$file)
      values$df_data <- read.csv(input$file$datapath)
      rvTL$dflist[[input$file$name]] <-read.csv(input$file$datapath)
      rvTL$lfnamelist <- c( rvTL$lfnamelist, input$file$name )
    })

    observeEvent(input$Go, {
      temp <- values$df_data[-input$Delete, ]
      values$df_data <- temp
    })

    output$df_data_files <- renderPrint(input$file$name)
    output$values <- renderPrint(names(values))
    output$rvTL_names <- renderPrint(names(rvTL$dflist))
    output$rvTL_out <- renderTable(rvTL$dflist[[input$lftoshow]])
    output$df_data_out <- renderTable(values$df_data)
    output$filesloaded <- renderUI(selectInput("lftoshow","File to show",choices=rvTL$lfnamelist))

  })
))

这是一个截图:

enter image description here