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

R Shiny中DataFrame按钮赋值后列丢失问题求助

解决R Shiny中DataFrame状态丢失与列被覆盖的问题

问题根源

你遇到的核心问题是:Shiny中普通全局变量无法在反应式上下文间保持状态。你定义的logs_data_frame是普通变量,每次observeEvent触发时,变量会回到初始的空数据框状态,导致后续修改时丢失之前添加的列,最终出现"0列1行"的错误。

解决方案

必须使用Shiny的反应式值容器(reactiveValues)来存储数据框,确保状态在整个应用生命周期中被保留。以下是修改后的完整代码:

1. 初始化反应式数据框容器

替换原来的空DataFrame定义:

# 用reactiveValues创建可响应的数据框容器
rv <- reactiveValues(
  logs_data_frame = data.frame(matrix(nrow = 1))
)
# 移除默认生成的多余列
rv$logs_data_frame$matrix.nrow...1. <- NULL

2. 修改"bevestig"按钮的响应逻辑

操作反应式容器中的数据框,同时移除多余的错误赋值:

observeEvent(input$bevestig, {
  # 直接操作反应式容器内的数据框
  rv$logs_data_frame$session_id <- next_session_id_value + 1
  rv$logs_data_frame$activity_type <- input$dropdown_type
  rv$logs_data_frame$duration <- input$dropdown_duur
  rv$logs_data_frame$intensity <- input$dropdown_intensiteit
  rv$logs_data_frame$activity_start <- glue("{input$dropdown_gepland_uur}:{input$dropdown_gepland_min}:00")
  rv$logs_data_frame$insuline_pump <- NA
  rv$logs_data_frame$previous_flow <- NA
  rv$logs_data_frame$new_flow_number <- NA
  rv$logs_data_frame$action_bolus <- NA
  rv$logs_data_frame$action_basaal <- NA
  rv$logs_data_frame$action_carbs <- NA
  rv$logs_data_frame$recommendation_bolus <- NA
  rv$logs_data_frame$recommendation_basaal <- NA
  rv$logs_data_frame$recommendation_carbs <- NA
  rv$logs_data_frame$date <- Sys.Date()
  rv$logs_data_frame$pid <- as.numeric(str_sub(input$dropdown_participant, 5, nchar(input$dropdown_participant)))
  
  showNotification("Activiteit aangemaakt", type = "message")
  # 移除错误的赋值语句:logs_data_frame[1] <- logs_data_frame
})

3. 修改"showQuestions"按钮的响应逻辑

同样操作反应式数据框,移除错误的行赋值:

observeEvent(input$showQuestions, {
  print(rv$logs_data_frame)
  
  # 直接更新反应式数据框的列
  rv$logs_data_frame$glucose_reading[1] <- input$bg_current
  
  sub_times <- hms(chron(times = rv$logs_data_frame$activity_start) - chron(times = glue("{input$hours_current}:{input$minutes_current}:00")))
  sub_times_to_minutes <- hour(sub_times) * 60 + minute(sub_times)
  rv$logs_data_frame$t_minus[1] <- sub_times_to_minutes
  
  print(rv$logs_data_frame)
})

关键修改说明

  • 反应式容器:reactiveValues会跟踪数据框的变化,确保所有反应式上下文(如observeEvent)都能访问到最新的状态,不会重置变量。
  • 移除错误赋值:原来的logs_data_frame[1] <- logs_data_frame和logs_data_frame[nrow(logs_data_frame), ] <- logs_data_frame语句会意外覆盖数据框结构,导致列丢失,必须删除。
  • 统一操作对象:所有对数据框的读写都指向rv$logs_data_frame,保证状态一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:40:26