如何保存表单数据,因为它是进入闪亮的应用程序r

时间:2017-12-14 19:42:11

标签: r shiny

我正在处理具有本地文件存储的数据库程序。我想在单击sumbit按钮(goButton)之前将表单条目保存在临时变量和关联的临时文件中(因此如果窗口关闭,用户可以返回)。这适用于单个用户。问题:1)当两个字段都输入了文本(但没有按下按钮)时,为什么脚本会记录最后一个输入(名称)和id的空白条目? 2)有没有办法监控多个输入而无需为每个输入进行连线和观察(真实代码有100多个字段)?

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

# on first run uncomment below and run
    # temp <- list(id = numeric(), name=character())
    # saveRDS(temp,"temp.rds")

#import table data
mydata <- as.data.table(readRDS("mydata.rds"))

# read temp file
temp <- readRDS("temp.rds")
temp

# ui
ui <- fluidPage(dataTableOutput("table"), # datatable here
               # form inputs
               numericInput(inputId ='id', label = 'Enter new ID', value =temp$id), 
               textInput(inputId ='name', label = 'Enter new name', value = temp$name),
               actionButton(inputId ="goButton", label = "Update Table"))

server <- function(input,output, session){
  # when user submits form, delete temp file. 
  observeEvent(input$goButton,{
    temp <- list(id = numeric(), name=character())
    saveRDS(temp, "temp.rds")
    temp
    # updateTextInput()
  })

  # save form data as its entered
  observeEvent(input$id, {
    temp$id <- input$id
    saveRDS(temp, "temp.rds")

  })
  observeEvent(input$name, {
    temp$name <- input$name
    saveRDS(temp, "temp.rds")

  })

  # DT output 
  output$table <- renderDataTable(df())
  # update datatable 
  df <- eventReactive(input$goButton, {
    if(input$id !="" && !(input$id %in% unique(mydata$id)) && input$goButton>0){
      newrow = data.table(id = input$id,
                          val = input$name)
      mydata <<- rbind(mydata, newrow)
    }else{ 
      if(input$id !="" && (input$id %in% unique(mydata$id)) && input$goButton>0){
        mydata[id==input$id, val := input$name]
        mydata <<- mydata
      }
    }
    saveRDS(mydata,"mydata.rds")
    mydata
    #write report

  }, ignoreNULL = FALSE)
}

shinyApp(ui,server)

1 个答案:

答案 0 :(得分:1)

我认为您需要使用&#34;&lt;&lt; - &#34;箭头改变观察者的温度。

  observeEvent(input$goButton,{
    temp <<- list(id = numeric(), name=character())
    saveRDS(temp, "temp.rds")
    temp
    # updateTextInput()
  })
  observeEvent(input$id, {
    temp$id <<- input$id
    saveRDS(temp, "temp.rds")

  })
  observeEvent(input$name, {
    temp$name <<- input$name
    saveRDS(temp, "temp.rds")

  })

否则,每次填写一个字段时,temp.rds文件都会被临时对象覆盖,其中只存储了一个值。