未显式调用round_any却报错?integer64类对象适配问题排查
R脚本报错:integer64类型无
round_any适用方法 问题详情
调试该R脚本近一个月仍未解决:已知round_any是plyr包的函数,但未加载plyr包,通过ls("package: ")检查所有已加载包均无此函数,网上也未找到相关线索。在browser()中查看报错相关对象类型为double [4] (S3:integer64),目前纠结应将对象类改为非integer64,还是排查并消除round_any的调用。
报错信息
Error in `mutate()`: ! Problem while computing `..2 = across(...)`. Caused by error in `across()`: ! Problem while computing column `Property Count`. Caused by error in `UseMethod()`: ! no applicable method for 'round_any' applied to an object of class "integer64"
调用语句
market_stats_table = key_market_stats(historical_stats, historical_stats_by_class, report_quarter)
相关函数代码
total_stats = stats_combined %>% rename(`Net Absorption` = `Net Absorption QTD - Total`, `Net Absorption YTD` = `Net Absorption YTD - Total`, `Construction Deliveries` = `Construction Deliveries QTD`) %>% filter(Submarket %in% submarket_order) %>% mutate(Submarket = factor(Submarket, levels = submarket_order, ordered = T)) %>% arrange(Submarket) %>% mutate(across(c(`Direct Vacancy Rate`, `Overall Vacancy Rate`, `Overall Availability Rate`), scales::percent, accuracy = .1), across(any_of(sum_vars), scales::dollar, accuracy = 1, style_negative="parens", prefix=""), across(any_of(c("Full Service Gross Asking Rate", "Lease Rate")), scales::dollar)) %>% select(Submarket, all_of(stat_order)) market_stats_table(total_stats, cell_width = if_else(property_type == "Office", 1.05, .9), cell_height = if_else(property_type == "Office", .33, .27), submarket_order, totals)
数据结构
structure(list(Market = c("Los Angeles", "0.4", NA, "0.5", "0.3", "New York"), `Property Count` = c("New York", "0.3", NA, "0.2", "0.9", "New York"), C = c("Chicago", "0.1", NA, "0.4", "0.3", "DC"), D = c("DC", "0.7", NA, "0", "0.2", "DC"), e = c("Miami", "0.8", NA, "0.2", "0.1", "Los Angeles")), row.names = c(NA, 6L ), class = "data.frame")
解决方案建议
1. 定位round_any的实际调用源
- 运行
find("round_any")查看该函数的归属包,确认是否是其他依赖plyr的包间接加载了它 - 在
browser()触发报错时,输入traceback()查看完整调用栈,找到哪个函数在调用round_any
2. 处理integer64类型的两种思路
思路一:转换为普通数值类型
如果Property Count不需要保留integer64类型(如仅为计数数据),可在mutate前转换类型:
total_stats = stats_combined %>% mutate(`Property Count` = as.numeric(`Property Count`)) %>% # 后续原有代码 rename(...) %>% filter(...) %>% ...
注意:若integer64存储超大整数,转换为numeric可能丢失精度,计数类数据通常无此问题
思路二:为integer64实现round_any方法
若必须保留integer64类型,可自定义适配方法:
library(bit64) round_any.integer64 <- function(x, accuracy, f=round) { f(as.numeric(x)/accuracy) * accuracy }
3. 额外排查点
检查key_market_stats或market_stats_table函数内部是否有调用round_any的逻辑,报错发生在处理Property Count列时,大概率是某个格式化函数或自定义逻辑隐式触发了该调用。
内容的提问来源于stack exchange,提问作者wigglesthe3rd
相关产品推荐
相关产品推荐

