【问题标题】:accessing reactiveValues in a reactiveValuesToList访问 reactiveValuesToList 中的 reactiveValues
【发布时间】:2017-03-30 03:27:25
【问题描述】:

我不想指定单独的 fileInput 变量,而是使用 reactiveValues 来存储上传的 CSV 数据帧,以某种方式对其进行操作,然后存储它们以供以后加入。我的设计是通过文件名命名每个数据帧并附加到反应值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)

    })
  ))

【问题讨论】:

    标签: r shiny reactive


    【解决方案1】:

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

    • 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,这样您就可以检查反应值列表中保存的内容。

    所以这里是调整后的代码:

    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))
    
      })
    ))
    

    这是一个屏幕截图:

    【讨论】:

    • 再次感谢您如此清晰的解释!我现在看到我必须将 reactiveValues 初始化为列表 (rvTL$dflist) 才能保存其他东西。这正是我想要的!我想我有点执着于使用reactiveValuesToList 而不理解它。干杯!
    猜你喜欢
    • 2018-03-01
    • 2021-12-03
    • 1970-01-01
    • 2018-07-20
    • 2020-07-02
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多