Shiny中lubridate提取小时异常问题求助
解决Shiny中提取POSIXct时间小时数的问题
看起来你遇到的问题主要来自几个小的语法错误和重复解析时间的操作,我帮你梳理并修正一下:
关键错误点
- 列名赋值语法错误:你用了
<而不是赋值运算符<-,这导致Hour1和Hour2的列名根本没设置成功,R会把它当成比较运算而非赋值。 - 重复解析时间类型:你已经将
timesData$Time1和timesData$Time2转换成了POSIXct类型,却又用ymd_hms()去处理它们。ymd_hms()是用来将字符型时间字符串转成时间类型的,直接传入POSIXct对象会被强制转成字符,而这个字符格式和ymd_hms预期的YYYY-MM-DD HH:MM:SS不匹配,导致解析出错误时间(比如全为18)或直接失败得到NA。 - UI组件拼写错误:你把
tableOutput写成了tableOutupt,少了一个字母u,这会导致表格无法正常渲染。 - Server函数括号错误:原代码里
shinyServer(function(input, output))({多了一个闭合括号,属于语法错误。 - 重复加载包:在Server函数内重复调用
library(lubridate)没必要,建议在脚本开头统一加载。
修正后的完整代码
首先在脚本开头加载所需包:
library(shiny) library(lubridate)
然后修正Server和UI部分:
shinyServer(function(input, output) { output$contents <- renderTable({ inFile <- input$file1 if (is.null(inFile)) return(NULL) # 注意:如果你的文件是空格分隔,把sep改成" ";逗号分隔则保留sep="," myDF <- read.csv(inFile$datapath, sep=",") # 直接在原数据集上转换时间列,无需额外创建timesData myDF$Time1 <- as.POSIXct(myDF$Time1, format="%m/%d/%Y %H:%M", tz="GMT") myDF$Time2 <- as.POSIXct(myDF$Time2, format="%m/%d/%Y %H:%M", tz="GMT") # 直接对POSIXct类型列使用hour()提取小时数,无需二次解析 myDF$Hour1 <- hour(myDF$Time1) myDF$Hour2 <- hour(myDF$Time2) # 返回处理后的完整数据集 myDF }) }) shinyUI( fluidPage( mainPanel( tableOutput("contents") ) ) )
额外说明
- 核心修正点:对已经是
POSIXct类型的列直接使用hour()函数即可提取小时数,不需要再用ymd_hms()重复转换,这是解决小时数错误的关键。 - 如果你的原始数据列顺序为
Date, Time1, Time2,上述代码中直接操作myDF$Time1和myDF$Time2是完全正确的。 - 关于文件分隔符:如果上传的文件是空格分隔而非逗号,记得把
sep=","改成sep=" ",否则会导致列读取混乱。
这样修改后,就能正确提取出Time1和Time2中的小时数,得到你期望的输出了。
内容的提问来源于stack exchange,提问作者Jennifer B.
相关产品推荐
相关产品推荐

