You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言Shiny中基于组件值为现有DataFrame添加新行的实现

Shiny 表格追加新行实现方案

以下是修改后的完整可运行代码,点击Add按钮即可将侧边栏当前选中值作为新行添加到表格中:

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(DT)
Input<-structure(list(`Security Type` = c("Stock", "Stock", "Load Fund"
), Ticker = c("XOM", "NFLX", "AMCPX"), `Purchase Date` = structure(c(16070, 
                                                                     17084, 17084), class = "Date"), `Sale Date` = structure(c(18627, 
                                                                                                                               NA, 18545), class = "Date"), `Amount Invested` = c("$10,000", 
                                                                                                                                                                                  "$8,000", "$10,000")), class = c("spec_tbl_df", "tbl_df", "tbl", 
                                                                                                                                                                                                                   "data.frame"), row.names = c(NA, -3L))
shinyApp(
  ui = tags$body(class="skin-blue sidebar-mini control-sidebar-open",dashboardPage(
    options = list(sidebarExpandOnHover = TRUE),
    header = dashboardHeader(title = "Investment Advisor Monitoring - Insider Trading",titleWidth = 450),
    
    sidebar = dashboardSidebar(minified = F, collapsed = F,
                               selectInput("sectype", "Security Type",
                                           c(unique(Input$`Security Type`))),
                               selectInput("sectick", "Ticker",
                                           c(unique(Input$Ticker))),
                               dateInput("PurDate", "Purchase Date", value = as.Date("2013-12-31")),
                               dateInput("selDate", "Sale Date", value = as.Date("2019-01-31")),
                               selectInput("aminv", "Amount Invested",
                                           c(unique(Input$`Amount Invested`))),
                               actionButton("add","Add")
                               
    ),
    body = dashboardBody(
      h3('Results'),
      tabsetPanel(id = "tabs",
                  tabPanel("InsiderTraining",
                           dataTableOutput("TBL1")
                  )
      )
    ),
    controlbar = dashboardControlbar(width = 300
    ),
    title = "DashboardPage"
  )),
  server = function(input, output) { 
    # 定义响应式数据容器,存储可动态修改的表格数据
    rv_data <- reactiveVal(Input)
    
    # 监听Add按钮点击事件,触发时追加新行
    observeEvent(input$add, {
      # 组装结构与原表完全一致的新行
      new_row <- data.frame(
        `Security Type` = input$sectype,
        Ticker = input$sectick,
        `Purchase Date` = input$PurDate,
        `Sale Date` = input$selDate,
        `Amount Invested` = input$aminv,
        check.names = FALSE
      )
      # 更新响应式数据
      rv_data(rbind(rv_data(), new_row))
    })
    
    # 渲染动态更新的DT表格
    output$TBL1<-renderDataTable(
      datatable(rv_data())    
    )
  }
)

核心逻辑说明

  • 用reactiveVal创建响应式数据容器,替代原有的静态数据集,只有响应式数据发生变化时,关联的前端组件才会自动更新
  • 新行组装时通过check.names = FALSE保留原表带空格的列名,避免列结构不匹配导致的追加失败
  • 每次点击Add按钮后,会将新行拼接到原有数据集末尾,同步更新前端展示的表格内容

内容的提问来源于stack exchange,提问作者firmo23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:24:03