如何通过自定义函数自动生成并展示计算步骤
自动生成计算步骤列的R实现
现有场景
你已经实现了自定义计算公式的函数my_formula,并能将其应用到数据框生成计算结果,但目前手动编写case_when生成计算步骤列的方式不够灵活,需要自动化实现。
现有代码
自定义公式函数:
my_formula <- function(x, y, z = 195.084){ output = case_when( y == "A" ~ x/z * 300.05, y == "B" ~ x/z * 397.28, .default = x ) return(output) }
目标数据框:
df <- structure(list(id = 1:2, ppm = c(0.73, 0.807), material = c("A", "B")), class = "data.frame", row.names = c("1", "2"))
手动生成计算步骤的代码:
library(dplyr) df %>% mutate(ppm_calculated = my_formula(ppm, material)) %>% mutate(calculation = case_when( material == "A" ~ sprintf("%.3f / 300.05 * 195.084", ppm), material == "B" ~ sprintf("%.3f / 397.28 * 195.084", ppm), .default = as.character(ppm) ))
自动化解决方案
核心是将material与对应计算系数的映射关系抽离成配置表,实现逻辑与配置分离:
步骤1:定义系数配置表
把不同material对应的计算系数和默认参数z统一管理:
library(dplyr) # 配置material对应的计算系数 coef_table <- tibble( material = c("A", "B"), coef = c(300.05, 397.28), z = 195.084 # 对应原函数的默认参数 )
步骤2:关联配置表完成计算与步骤生成
通过left_join关联数据框与配置表,自动计算结果并生成步骤文本:
df %>% left_join(coef_table, by = "material") %>% mutate( # 自动计算结果(替代原my_formula函数逻辑) ppm_calculated = case_when( !is.na(coef) ~ ppm / z * coef, .default = ppm ), # 自动生成计算步骤文本 calculation = case_when( !is.na(coef) ~ sprintf("%.3f / %.4f * %.4f", ppm, coef, z), .default = as.character(ppm) ) ) %>% # 移除中间辅助列 select(-coef, -z)
执行结果
id ppm material ppm_calculated calculation <int> <dbl> <chr> <dbl> <chr> 1 1 0.730 A 1.12 0.730 / 300.0500 * 195.0840 2 2 0.807 B 1.64 0.807 / 397.2800 * 195.0840
方案优势
- 可扩展:新增
material类别时,仅需在coef_table中添加一行,无需修改业务代码 - 防出错:计算逻辑与步骤文本共享同一套配置参数,避免手动编写时的参数不一致问题
- 更简洁:消除重复的
case_when分支,代码结构更清晰
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

