R语言使用match函数编写自定义计算函数时报错找不到c_total_biomass
问题原因
- 直接报错触发点:你在代码中写了
c_total_biomass(match("R", stage)),R语言中圆括号默认代表调用函数,而c_total_biomass是数值向量不是函数,因此抛出“找不到函数”的报错,提取向量元素需要使用方括号[]。 - 隐藏逻辑错误:你使用了
rowwise()逐行运算,此时传入自定义函数的stage是当前行的单个字符串,不是完整的stage列向量,因此match("R", stage)永远无法匹配到结果,即使修复括号问题也无法得到正确的首次R对应的生物量。
修正方案
先把全局的首次出现R对应的生物量基准值单独计算,再传入自定义函数即可,修正后的完整代码如下:
library(dplyr) p_hi <- 0.472 rate_increase_hi <- 1.058*10^(-3) # 全局计算首次出现R对应的c_total_biomass基准值 c_total_biomass <- seq(0, 1600, 100) stage <- c(rep("V", 10), rep("R", 7)) first_R_biomass <- c_total_biomass[match("R", stage)] # 简化自定义函数,移除不必要的参数和逻辑 seed.mass.fraction.f <- function(stage, p_hi, rate_increase_hi, c_total_biomass, first_R_biomass){ seed.mass.fraction <- 0 rate_increase_hi <- dplyr::if_else(stage == "V", 0, rate_increase_hi) c_biomass_during_rep <- dplyr::if_else(stage == "V", 0, c_total_biomass - first_R_biomass) seed.mass.fraction <- rate_increase_hi * c_biomass_during_rep # 超过p_hi时自动封顶 seed.mass.fraction <- pmin(seed.mass.fraction, p_hi) return(seed.mass.fraction) } # 生成结果表 data.smf <- data.frame(stage, c_total_biomass) %>% rowwise() %>% mutate(smf = seed.mass.fraction.f(stage, p_hi, rate_increase_hi, c_total_biomass, first_R_biomass)) %>% ungroup()
运行结果验证
前10行V阶段的smf全部为0,R阶段从第一个R行开始,smf依次为0、0.1058、0.2116、0.3174、0.4232、0.472、0.472,和需求的计算逻辑完全一致。
内容的提问来源于stack exchange,提问作者Giuseppe Petri
相关产品推荐
相关产品推荐

