Shinyapps.io部署调用mdy_hms()报错,本地运行正常
Shinyapps.io部署时lubridate时间处理报错:无法将'closure'类型转为character
问题背景
本地运行正常的Shiny项目,部署到Shinyapps.io后出现函数调用错误。项目核心逻辑是读取指定目录下的CSV文件,使用lubridate包的mdy_hms()函数解析时间戳字段。
项目文件结构与代码
目标文件夹结构:
input$dir/ ├─ file1.csv ├─ file2.csv └─ ...
数据处理代码:
files <- list.files(input$dir, pattern = ".csv", full.names = TRUE) %>% set_names() %>% map_dfr(read_csv, .id = "file") %>% mutate(datetime = mdy_hms(timestamp), date = as.Date(datetime), DeployID = as.character(`tag-local-identifier`), Latitude = `location-lat`, Longitude = `location-long`) %>% distinct(DeployID, datetime, .keep_all = TRUE)
报错信息
Warning: Error in mutate: Problem while computing
datetime = mdy_hms(timestamp).
Caused by error inas.character():
cannot coerce type 'closure' to vector of type 'character'
已确认导入的timestamp列是字符(chr)类型,本地运行无异常,怀疑存在函数名掩码问题。
解决方案
直接通过命名空间显式调用lubridate包中的mdy_hms()函数,修改mutate段代码如下:
mutate(datetime = lubridate::mdy_hms(timestamp), date = as.Date(datetime), DeployID = as.character(`tag-local-identifier`), Latitude = `location-lat`, Longitude = `location-long`)
原因分析
Shinyapps.io的服务器环境中,可能存在其他已加载的包或自定义函数与mdy_hms重名,导致代码调用的不是lubridate包中的时间解析函数,而是一个闭包(closure)对象,进而触发类型转换错误。显式添加lubridate::前缀可以强制指定函数来源,彻底避免命名冲突问题。
内容的提问来源于stack exchange,提问作者Zachary Lehmann
相关产品推荐
相关产品推荐

