在R Shiny中覆盖和更新数据

时间:2019-08-09 10:36:31

标签: r shiny

我正在用R Shiny构建一个应用程序,其中包含受Dean Attali模仿的Google表单启发的部分。在这里,我将表单数据存储在R本身中,稍后将在服务器端呈现该数据并将其用作输入值。在应用程序开始时,将没有预存储的值。在“新情况”面板中输入文本时,该名称将自动在“情况”面板中呈现。我们将值放在数字面板中,并借助于Dean Attali的保存功能,要求将条目以表格的形式保存在R中。同样,在加载保存的表时,可以使用它从“情境”面板中选择保存的情境。同样,当创建一个新条目时,这些值应追加到R中先前保存的表中(该表是在存储第一个条目时创建的),因此新值将继续追加到该表中。所有这些功能都可以在应用程序中使用。

但是我还想添加一个附加功能,其中当选择一个已经存在的情况并由用户更改其相应的数值时,这些值应在R中的已保存表中覆盖,以便下次使用选择这种情况,我们可以看到更改的值。这些值只能附加到名称在保存的R表中不存在的新条目上,否则必须将其覆盖。

正如您在原始保存功能(在代码中注释掉)中所看到的那样,它仅告诉您添加任何新条目。我试图修改该函数以使用特定情况下更改的值覆盖行,但没有成功。

我用来覆盖的方法是使用两个表:1.已保存的R表。 2.具有来自用户的值的单个行表。通过使用相同的方法,我能够覆盖函数外部的两个表之间的数据,但不能覆盖保存函数内部的两个表。新条目将追加,但是当旧值更改时,它不会被覆盖。有趣的是,尽管更改后的值正在控制台中显示,但在已保存的表中不会覆盖。

Globar.R脚本

     fields <- c("situation","v1","v2","v3")

原始功能

    # saveData <- function(data){
    #   data <- as.data.frame(t(data))
    #   if (exists("responses")){    
    #     responses <<- rbind(responses, data)
    #   }
    #   else{
    #     responses <<- data
    #   }
    # }

保存和加载功劳归功于Dean Attali。我已尝试修改该功能,以便覆盖特定情况下的所有更改值 否则,如果输入新情况,则将其rbind到R中的已保存表中。

由我修改

     saveData <- function(data){
     data <- as.data.frame(t(data))
       if (exists("responses")){
         if(!is.na(match(data$situation == responses$situation)){
              responses <- data.table(responses, key = "situation")
              data <- data.table(data, key = "situation") 
              rownames(responses) = responses$situation
              rownames(data) = data$situation      
              responses[rownames(data),] = data
            } 
       if(is.na(match(data$situation,responses$situation))){
              responses <<- rbind(responses, data)
            }
         }
      else{
 responses <<- data
     }
 print(responses)
 }

我尝试在闪亮的外部做类似的事情,并且奏效了(第一个条件)。我提供了需要查看的代码。在这里,我创建了两个数据帧dfa和dfb,其中特定的dfa情况被dfb中的相同情况覆盖。尽管情境名称的顺序在覆盖后会在dfa中更改,但您可以使用不同的值进行检查并起作用。

    dfa <- data.frame(situation = c("Deka","Jitu","JD"), v1 = 
                c(100,200,400), v2 = c(400,600,800),v3 = c(50,40,30))

    dfb <- data.frame(situation = c("Jitu", "JJ"), v1 = c(700,550), v2 = 
                    c(1400,6000), v3 = c(75,55))

    dfa <- data.table(dfa, key = "situation")
    dfb <- data.table(dfb, key = "situation")

    rownames(dfa) = dfa$situation
    rownames(dfb) = dfb$situation

    dfa[rownames(dfb), ] = dfb

我已包含print以查看保存功能正在做什么。每当我更改现有情况的值时,更改后的值就会在控制台中打印为

第一行中的新值已更改,旧值请参见下文。

     Listening on http://127.0.0.1:6024
     situation     v1    v2    v3
     1:      Jitu   3000   200   400
     2:      Deka    473  1221   434
     3:       JMD    795  2432  3534
     4:     Bruno    235   657   243
     5:      Hago    546  5345  1233
     6:      Game   2536 13231 12312
     7:     Jitu1 243324  2432 24234
     8:     Jitu2    567   697  2433 

已打印的旧表值

     situation     v1    v2    v3
     1      Jitu   3565   234   424
     2      Deka    473  1221   434
     3       JMD    795  2432  3534
     4     Bruno    235   657   243
     5      Hago    546  5345  1233
     6      Game   2536 13231 12312
     7     Jitu1 243324  2432 24234
     8     Jitu2    567   697  2433

我也想知道1:的含义,它表示什么。尝试在Google中搜索,但找不到任何答案。只有当您尝试更改旧值而不是新条目时,您会得到1 ::

      #Function to load the data

      loadData <- function() {
        if (exists("responses")) {
                 responses
       }
     }

下面的闪亮代码只是我的应用程序的简单版本,而是我的应用程序的基础。

       library(shiny)
       library(data.table)
       library(DT)
       library(tidyverse)


      ui <- fluidPage(  
       textInput("situation_new", "New Situation"),
       uiOutput("situation_ui"),
       uiOutput("V1_ui"),
       uiOutput("V2_ui"),
       uiOutput("V3_ui"),
       DT::dataTableOutput("table"),
       actionButton("submit", "Submit")
       )

     server <- function(session,input,output){

     # Creating a Null dataframe using reactive values.

      values <- reactiveValues(df = data.frame(situation = character(),v1 
       = double(), v2 = double(),v3 = double(),stringsAsFactors = FALSE))


     # Filling up the form data

      formData <- reactive({
      data <- sapply(fields, function(x) input[[x]])
      data
      })

    # Saving the filled in form

      observeEvent(input$submit,{   
           saveData(formData())
         })

    # Loading the saved form

       Load_Table <- reactive({
       input$submit
       loadData()  
       })

    # Table to be used for the selection
        table_selectinputs <- reactive({
           dat0 <- Load_Table ()

        if (exists("dat0")){
            dat0 <- rbind(values$df,dat0)
           }    
        else {
              values$df
          }
       })

    # Selecting situations and new situation inputs

         output$situation_ui <- renderUI({
                  selectInput("situation", "Situation",           
    c(input$situation_new,as.character(table_selectinputs()$situation)))
        })

      output$V1_ui <- renderUI({ 
               numericInput("v1", "Value 1", min = 0, max = 10000, value = 
                             "", step = 1)
       })

      output$V2_ui <- renderUI({
               numericInput("v2", "Value 2", min = 0, max = 10000, value = 
                           "", step = 1)
      })

      output$V3_ui <- renderUI({
               numericInput("v3", "Value 3", min = 0, max = 10000, value = 
                           "", step = 1)
      })

    # Update the numeric values

      observeEvent(input$situation,
           updateNumericInput(session,"v1", "Value 1", min = 0, max = 
           10000, value = 
           as.numeric(as.character(table_selectinputs()$v1))
           [as.character(table_selectinputs()$situation) == 
           input$situation],step = 1))
      observeEvent(input$situation,
           updateNumericInput(session,"v2", "Value 2", min = 0, max = 
           10000, value = 
           as.numeric(as.character(table_selectinputs()$v2)) 
           [as.character(table_selectinputs()$situation) == 
           input$situation],step = 1))
     observeEvent(input$situation,
           updateNumericInput(session,"v3", "Value 3", min = 0, max = 
           10000, value = 
           as.numeric(as.character(table_selectinputs()$v3)) 
           [as.character(table_selectinputs()$situation) == 
           input$situation],step = 1))

     # Rendering Table

     output$table <- DT::renderDataTable(datatable({
               table_selectinputs()
        }))

     shinyApp(ui,server)

我想以某种方式使用保存功能,以便在对情况进行更改时将其保存为相同的情况,但是使用新的更改值,否则任何新条目都是对存储表的新添加。

在这方面我需要帮助,因为作为非编程背景,我的语言基础仍然不足以理解这些复杂的问题。我已经尝试了太长时间,因此决定将此问题发布在这里作为最后的解决方法。因此,非常感谢任何人的帮助

0 个答案:

没有答案