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

Shiny中rhandsontable日期选择无法替换值及警告问题求助

问题修复方案

问题分析

  1. 日期无法保存的核心原因:在renderRHandsontable函数中,每次渲染都会通过mutate(Transaction date = as.Date("2022-01-01"))强制将日期重置为固定值,直接覆盖了用户选择的日期。
  2. 列类型冲突:重复调用hot_col(1, type = "dropdown")和hot_col(1, type = "date"),导致列类型设置冲突。
  3. 拼写错误:strecH应为stretch。
  4. 日期转换警告:警告源于R版本对as.character.POSIXt的参数变更,需确保日期处理符合当前R的规范。

修改后的完整代码

library(shiny)
library(data.table)
library(rhandsontable)
library(shinydashboard)
library(dplyr)

`Cash in hand` <- data.table(
  "Transaction date" = as.Date("2022-01-01"),
  "Profit" = as.numeric(0),
  "Loss" = as.numeric(0),
  "Balance" = as.numeric(0),
  stringsAsFactors = FALSE
)

ui <- fluidPage(
  dashboardPage(
    dashboardHeader(title = "Accounting"),
    dashboardSidebar(
      sidebarMenu(
        menuItem("Home", tabName = "home"),
        menuItem("Current assets", tabName = "current_assets", 
                 menuItem("Cash", tabName = "cash",
                          menuSubItem("Cash in hand", tabName = "cash_in_hand")
                 )
        )
      )
    ),
    dashboardBody(
      tabItems(
        tabItem(tabName = "home",
                h2("Welcome to the Home Page")
        ),
        tabItem(tabName = "cash_in_hand",
                rHandsontableOutput("Table1010")
        )
      )
    )
  )
)

server <- function(input, output) {

  data <- reactiveValues()

  # 初始化数据
  observe({
    input$recalc
    data$df1010 <- as.data.frame(`Cash in hand`)
  })

  # 接收用户修改后的数据
  observe({
    if (!is.null(input$Table1010)) {
      updated_data <- hot_to_r(input$Table1010)
      # 确保日期列格式正确
      updated_data$`Transaction date` <- as.Date(updated_data$`Transaction date`)
      # 重新计算余额
      updated_data$Balance <- updated_data$Profit + updated_data$Loss
      data$df1010 <- updated_data
    }
  })

  output$Table1010 <- renderRHandsontable({
    req(data$df1010)
    
    rhandsontable(data$df1010, stretch = "all") %>%
      hot_col(1, type = "date", dateFormat = "YYYY-MM-DD") %>%
      hot_col(c("Profit", "Loss", "Balance"), type = "numeric")
  })
}

shinyApp(ui, server)

关键修改点说明

  • 移除强制重置日期的代码:删除了mutate(Transaction date = as.Date("2022-01-01")),保留用户选择的日期。
  • 统一列类型设置:仅保留hot_col(1, type = "date", dateFormat = "YYYY-MM-DD"),明确日期格式,避免类型冲突。
  • 调整余额计算逻辑:将余额计算移至接收用户输入的observe中,确保每次修改后自动更新余额,同时不影响日期的保存。
  • 修复拼写错误:将strecH改为stretch。
  • 规范日期转换:在接收数据时显式转换日期列格式,避免警告信息。

内容的提问来源于stack exchange,提问作者firuz.safaev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:45:53