我正在处理具有本地文件存储的数据库程序。我想在单击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)
答案 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文件都会被临时对象覆盖,其中只存储了一个值。