RStudio中函数参数长度为0错误排查及deadcheck函数问题咨询
Hey there, let's figure out why your deadcheck function is throwing that "argument of length 0" error in RStudio, and walk through how to fix it.
错误的核心原因
Looking at your code, there are a few critical issues triggering this error:
未定义变量
i: 你的函数参数是a和t,但代码里却用了birthmort$age[i]——i在函数里完全没定义!R找不到这个变量,要么返回空值,要么直接中断代码逻辑,这是最致命的问题。你应该用传入的参数a来索引,比如birthmort$age[a]才对。逻辑判断语法错误: 这行
roe<-which( birthmort$age[i]==fertmortc$min & fertmortc$max)的逻辑完全不成立。&是向量逻辑与运算符,两边都需要完整的逻辑判断,但你只写了fertmortc$max,这会把max列的数值直接转成逻辑值(0为FALSE,非0为TRUE),而不是判断年龄是否落在min和max之间。正确逻辑应该是年龄在min到max范围内,也就是birthmort$age[a] >= fertmortc$min & birthmort$age[a] <= fertmortc$max。空索引导致长度为0值: 因为前面的逻辑错误,
roe很大概率是个空向量(没有符合条件的行)。当你用空向量去取fertmortc$mortality[roe]时,得到的就是长度为0的向量,R无法对空值进行幂运算,自然就抛出了"argument of length 0"的错误。
问题排查步骤
你可以按以下步骤系统调试:
分步测试代码块: 把函数里的代码拆出来,用实际的
a和t值逐行运行:- 先测试
birthmort$age[a],确认它返回的是有效年龄值,而非空值。 - 单独运行逻辑判断部分:
birthmort$age[a] >= fertmortc$min & birthmort$age[a] <= fertmortc$max,看返回的逻辑向量里有没有TRUE,确认是否有匹配的行。 - 检查
roe <- which(...)的结果,如果是空的,说明birthmort和fertmortc的年龄范围没有重叠,需要先修正数据匹配问题。
- 先测试
检查变量作用域: 函数只能使用参数或内部定义的变量,绝对不要依赖全局环境里的
i这类未传入的变量——全局变量在函数里可能不可用,或导致意外结果。显式处理空值情况: 哪怕逻辑正确,也可能出现无匹配行的情况,所以要加判断:如果
length(roe) == 0,就返回默认值或抛出明确警告,避免后续代码崩溃。
修正后的函数示例
这里是修复了所有问题的函数版本:
deadcheck <- function(a, t) { # 用于检查特定年龄在指定时间是否死亡的函数 # 获取要检查的目标年龄 target_age <- birthmort$age[a] # 筛选fertmortc中年龄在[min, max]范围内的行 roe <- which(target_age >= fertmortc$min & target_age <= fertmortc$max) # 处理无匹配行的情况 if (length(roe) == 0) { warning(paste("未找到匹配年龄范围的记录,年龄:", target_age)) return(FALSE) # 可根据需求调整默认返回值 } # 计算死亡概率:先算每日存活概率,再计算t天后的死亡概率 daily_survival_prob <- (1 - fertmortc$mortality[roe])^(1/365) death_prob <- 1 - (daily_survival_prob)^t # 随机判断是否死亡 is_dead <- runif(1, 0, 1) <= death_prob return(is_dead) }
内容的提问来源于stack exchange,提问作者Ebony

