数据框不会在 Shiny R 中使用 observeEvent 更新

Data frame won't update using observeEvent in Shiny R

我是一个新手程序员,如果我不清楚或缺少相关信息,请原谅。我编写了一个闪亮的应用程序,它从另一组代码导入数据框。我想用应用程序中的用户输入更新该数据框。我已经使用下面的代码将数据框作为反应变量上传:

数据

current.shiny <- data.frame("Task" = as.character(c("Task 1", "Task 2", "Task 3")), "Completed" = as.character(c("Yes", "NO", "Yes")),"Date.Completed" = as.Date(c("2020-10-19","2020-10-20", "2020-10-21")))

UI

ui<- fluidPage(
  
  # Application title
  titlePanel("Week of 11.02.2020"),
  
  # Sidebar with reactive inputs
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "task.choice", label = "Task",
                  choices =  c(as.list(current.shiny$Task))),
      selectInput(inputId = "completed", label = "Completed?",
                  choices = c("Yes" = "Yes", "No" = "No")),
      dateInput(inputId = "date.completed", label ="Date Completed"),
      actionButton("update","Update Sheet")
      
    ),
    
    # a table of reactive outputs
    mainPanel(
      mainPanel(
        
        #DT::dataTableOutput("dt_table", width = 500)
        
      )
    )
  ),
  # column(12,
  #        DT::dataTableOutput("data", width = "100%")),
  column(12,
         DT::dataTableOutput("xchange", width = "100%"))
)

服务器 1


server <- function(input, output) {
# # Re-read data for any changes, write to csv new changes, ignore startup
 observeEvent(input$update,{
   test.data<-current.shiny
   test.data$Completed[test.data$Task == input$task.choice]<-as.character(input$completed)
   ignoreInit=T
 })

 # #Reactive variable xchange that updates the values of data
 xchange<-reactive({
   test.data<-current.shiny
   test.data$Completed[test.data$Task == input$task.choice]<-as.character(input$completed)
   test.data$Date.Completed[test.data$Task == input$task.choice]<-as.Date(input$date.completed)
   test.data
 })

 #Display the most recent file, with the most recent changes
 output$xchange <- renderDataTable({
   datatable(xchange(), options = list(dom = "t"))
 })
}
shinyApp(ui,server)

这在一定程度上有效。但是,它反应过度,因为我需要它只在按下按钮后更新 table 。上面代码中的 observeEvent 函数似乎没有做任何事情(它主要是 copy/pasted 来自另一个堆栈溢出线程)。我试图在下面进行设置,但我无法将其设置为 运行。

服务器 2

server <- function(input, output, session) {
  rxframe <- reactiveVal(
    as.data.frame(current.shiny)
  )
  observeEvent(input$update, {
    rxframe$Completed[rxframe$Task == input$task.choice]<-as.character(input$completed)
  })
  output$xchange <- shiny::renderTable( rxframe() )
}

shinyApp(ui, server)

谁能看出我错误地调用了 observeEvent 导致它无法正常运行?任何见解将不胜感激,我已经坚持了一段时间。

您的代码直接对每个更改做出反应,因为您使用的是 reactive

如果你想延迟反应,你可以使用 observeEventreactiveValueseventReactive

这是一个使用 reactiveValobserveEvent 的例子:

library(shiny)
library(DT)

current.shiny <- data.frame(
    "Task" = as.character(c("Task 1", "Task 2", "Task 3")),
    "Completed" = as.character(c("Yes", "NO", "Yes")),
    "Date.Completed" = as.Date(c("2020-10-19", "2020-10-20", "2020-10-21"))
  )

ui <- fluidPage(
  # Application title
  titlePanel("Week of 11.02.2020"),
  
  # Sidebar with reactive inputs
  sidebarLayout(
    sidebarPanel(
      selectInput(
        inputId = "task.choice",
        label = "Task",
        choices =  c(as.list(current.shiny$Task))
      ),
      selectInput(
        inputId = "completed",
        label = "Completed?",
        choices = c("Yes" = "Yes", "No" = "No")
      ),
      dateInput(inputId = "date.completed", label = "Date Completed"),
      actionButton("update", "Update Sheet")
    ),
    mainPanel(column(
      12,
      DT::dataTableOutput("xchangeOut", width = "100%")
    ))
  ))

server <- function(input, output) {
  xchange <- reactiveVal(current.shiny)
  observeEvent(input$update, {
    test.data <- xchange()
    test.data$Completed[test.data$Task == input$task.choice] <-input$completed
    test.data$Date.Completed[test.data$Task == input$task.choice] <- input$date.completed
    xchange(test.data)
    # write.csv
  })
  
  #Display the most recent file, with the most recent changes
  output$xchangeOut <- renderDataTable({
    datatable(xchange(), options = list(dom = "t"))
  })
}

shinyApp(ui, server)