我希望我在R中的shiny 应用程序读取Excel文件,添加空行,用户可以在其中添加文本输入,单击按钮后,它会使用添加的输入更新表,表顶部的一行将再次为空,等待用户输入.我已经设法使它工作的第一次,例如,我可以添加输入,点击按钮,表更新和第一行是等待另一个输入.但是,当我再次添加新的输入时,表格将使用我第一次输入的相同文本进行更新. 看起来问题出在我更新ReactiveEvent()中的reactiveValues的那一行,因为当我删除那一行时,print语句会打印正确的输入.当我保留这一行时,只有第一个输入总是被打印出来.

非常感谢您的帮助!

library(shiny)
library(plyr)
library(dplyr)
library(DT)
library(xlsx)
library(lubridate)

ui <- fluidPage(fluidRow(column(4, offset = 0, actionButton("add_button", "Add", width = 200))), 
                br(),
                DT::dataTableOutput("outtable")
)

server <- function(input, output) {

    excel_file <- data.frame(Month = c("2024-01", "2023-12"), 
                             Date = c("2024-01-10", "2023-12-15"), 
                             Reviewer = c("A", "B"), 
                             Status = c("OK", "OK"), 
                             Comment = c("bla", "blabla"), stringsAsFactors = FALSE)
    
    excel_file <- excel_file %>%
        arrange(desc(Month))
    
    df_input <- data.frame(
        Month = as.character(format(ym(max(excel_file$Month)) %m+% months(1), "%Y-%m")),
        Date = as.character(textInput("date", label = NULL)),
        Reviewer = as.character(textInput("reviewer", label = NULL)),
        Status = as.character(textInput("status", label = NULL)),
        Comment = as.character(textInput("comment", label = NULL)))
    
    
    RV <- reactiveValues(dat = bind_rows(df_input, excel_file))
    
    observeEvent(
        eventExpr   = c(input$add_button),
        handlerExpr = {
            new_line <- data.frame(
                Month = as.character(format(ym(max(RV$dat$Month)), "%Y-%m")),
                Date = input$date,
                Reviewer = input$reviewer,
                Status = input$status,
                Comment = input$comment)
            print(new_line)
            
            temp <- bind_rows(RV$dat, new_line) %>%
                arrange(desc(Month))
            
            RV$dat <- temp # THIS LINE 
        },ignoreNULL = FALSE , ignoreInit = TRUE
    )
    
    output$outtable <- DT::renderDataTable({
        datatable(
            RV$dat,
            selection="none",
            escape = FALSE, 
            options = list(
                dom = 'rtpi',
                autoWidth=TRUE,
                preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
                drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ')
            )
        )
    })
}

shinyApp(ui = ui, server = server)

推荐答案

您正在使用datatable中的react 式数据帧来更新表.当它改变时,表格被重新绘制,shiny 的解除绑定/绑定丢失.取而代之的是,可以使用带有代理的replaceData.

library(shiny)
library(plyr)
library(dplyr)
library(DT)
library(lubridate)

excel_file <- data.frame(
  Month = c("2024-01", "2023-12"), 
  Date = c("2024-01-10", "2023-12-15"), 
  Reviewer = c("A", "B"), 
  Status = c("OK", "OK"), 
  Comment = c("bla", "blabla"), 
  stringsAsFactors = FALSE
)

excel_file <- excel_file %>% arrange(desc(Month))

df_input <- data.frame(
  Month = as.character(format(ym(max(excel_file$Month)) %m+% months(1), "%Y-%m")),
  Date = as.character(textInput("date", label = NULL)),
  Reviewer = as.character(textInput("reviewer", label = NULL)),
  Status = as.character(textInput("status", label = NULL)),
  Comment = as.character(textInput("comment", label = NULL))
)

dat <- bind_rows(df_input, excel_file)


ui <- fluidPage(
  fluidRow(
    column(
      4, 
      offset = 0, 
      actionButton("add_button", "Add", width = 200)
    )
  ), 
  br(),
  DTOutput("outtable")
)

server <- function(input, output, session) {
  
  Dat <- reactiveVal(dat)

  output$outtable <- renderDT({
    datatable(
      dat,
      selection = "none",
      escape = FALSE, 
      options = list(
        dom = 'rtpi',
        autoWidth = TRUE,
        preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
        drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ')
      )
    )
  })
  
  proxy <- dataTableProxy("outtable")
  
  observeEvent(
    eventExpr   = input$add_button,
    handlerExpr = {

      dat0 <- Dat()
      
      new_line <- data.frame(
        Month = as.character(format(ym(max(dat0$Month)), "%Y-%m")),
        Date = input$date,
        Reviewer = input$reviewer,
        Status = input$status,
        Comment = input$comment
      )

      dat1 <- bind_rows(dat0, new_line) %>% arrange(desc(Month))
      
      Dat(dat1)
      
      replaceData(proxy, dat1, resetPaging = FALSE)
      
    }, ignoreInit = TRUE
  )
  
}

shinyApp(ui = ui, server = server)

R相关问答推荐

从多个前置日期中获取最长日期

列出用m n个值替换来绘制n个数字的所有方法(i.o.w.:R中大小为n的集合的所有划分为m个不同子集)

更新合适的R mgcv::bam模型报告无效类型(关闭).'';错误

编码变量a、b、c以匹配来自另一个数据点的变量x

在R中列表的结尾添加数字载体

从开始时间和结束时间导出时间

如何改变时间图R中的悬停信息?

删除具有相同标题的tabPanel(shinly)

如何使用列表中多个列表中的第一条记录创建数据框

如何使用ggplot对堆叠条形图进行嵌套排序?

从一个列表的框架中移除列表包装器

使用rvest从多个页面抓取时避免404错误

将一个字符串向量调整为与其他字符串向量完全相同的大小

使用geom_iles在一个切片中包含多个值

通过初始的shiny 应用更新部署的shiny 应用的数据和参数,其中部署的应用程序显示为URL

使用同一行中的前一个值填充R矩阵中的缺失值

如何修改GT表中组名行的 colored颜色 ?

根据向量对列表元素进行排序

修复标签重叠和ggploy内的空间

使用另一列中的增长率外推R(使用dplyr)