使用Possibly捕获双参数函数报错:mapply调用未使用参数错误解决求助
R语言possibly函数调用报错排查与修复
错误原因定位
- 直接触发你遇到的
Error in .f(.x[[i]], ...) : unused argument (.x[[i]])报错的原因是:你定义的possibly_gender没有设置入参,但map遍历cast_first时会把每个遍历到的姓名作为参数传入possibly_gender,函数无法接收多余参数就会抛出该错误。 purrr::possibly的使用逻辑错误:possibly的作用是包装一个函数,让被包装的函数出错时返回预设的默认值,你当前的写法是直接执行mapply代码后将运行结果传给possibly,完全不符合该函数的设计用法,无法实现异常捕获的效果。- 自定义函数存在未定义变量错误:
get_gender中判断逻辑用到了gender_prob变量,但你全程没有定义过该变量,代码运行到判断分支时会直接抛出找不到对象的报错。 - 遍历逻辑严重冗余:
possibly_gender内部已经用mapply全量遍历了cast_first和cast_year,外层再用map遍历cast_first会导致65000条数据的全量计算重复执行65000次,既不符合需求也会带来极大的性能浪费。
修复方案
修正后可运行代码
# 1. 修复get_gender的未定义变量问题,简化返回逻辑 get_gender = function(name, year) { cast_gender <- gender::gender(name, years = year, method = "ssa")$gender # 无匹配结果时返回Unknown if(length(cast_gender) == 0) { return("Unknown") } return(cast_gender) } # 2. 用possibly正确包装处理函数,出错时返回字符型NA possibly_get_gender <- purrr::possibly(.f = get_gender, otherwise = NA_character_, quiet = TRUE) # 3. 同时遍历姓名、年份两个等长向量,调用包装好的函数直接返回字符向量结果 test <- purrr::map2_chr(.x = cast_first, .y = cast_year, .f = possibly_get_gender)
修复说明
- 删掉了冗余的
possibly_gender中间函数,直接用possibly包装单个数据的处理函数get_gender,实现单条数据处理出错时自动返回默认值的效果 - 用
map2替代mapply+map的冗余遍历逻辑,一次遍历同时传入姓名和年份参数,65000条数据仅需遍历一次,性能提升明显 - 修复了
get_gender中未定义gender_prob的逻辑错误,直接判断gender函数返回的结果长度即可识别无匹配的情况
内容的提问来源于stack exchange,提问作者JustBeginning
相关产品推荐
相关产品推荐

