使用循环优化两个R语言自定义函数(附代码示例)
R语言函数循环优化方案
需要优化以下两个R函数,用循环替代重复的paste0语句,RptYr为四位数字年份(如2023)。
原函数代码
函数1:AcaS_Sem
AcaS_Sem <- function(RptYr) { AcaS_1 <- paste0("Spring", " ", RptYr - 1) AcaS_2 <- paste0("Fall", " ", RptYr - 2) AcaS_3 <- paste0("Summer", " ", RptYr - 2) AcaS_comb <- c(AcaS_1, AcaS_2, AcaS_3) print(AcaS_comb) }
函数2:Enroll_Dem
Enroll_Dem <- function(RptYr) { Enroll_Dem_1 <- paste0("Fall", " ", RptYr) Enroll_Dem_2 <- paste0("Summer", " ", RptYr) Enroll_Dem_3 <- paste0("Spring", " ", RptYr) Enroll_Dem_4 <- paste0("Fall", " ", RptYr - 1) Enroll_Dem_5 <- paste0("Summer", " ", RptYr - 1) Enroll_Dem_6 <- paste0("Spring", " ", RptYr - 1) Enroll_Dem_7 <- paste0("Fall", " ", RptYr - 2) Enroll_vec <- c(Enroll_Dem_1, Enroll_Dem_2, Enroll_Dem_3, Enroll_Dem_4, Enroll_Dem_5, Enroll_Dem_6, Enroll_Dem_7) print(Enroll_vec) }
优化后的循环版本
优化AcaS_Sem
核心思路:先定义学期与对应年份偏移的映射关系,再通过循环遍历生成结果:
AcaS_Sem <- function(RptYr) { # 定义学期和对应的年份偏移量 sem_year_map <- list( c("Spring", -1), c("Fall", -2), c("Summer", -2) ) AcaS_comb <- character(length(sem_year_map)) # 循环生成每个学期字符串 for (i in seq_along(sem_year_map)) { sem <- sem_year_map[[i]][1] offset <- as.integer(sem_year_map[[i]][2]) AcaS_comb[i] <- paste0(sem, " ", RptYr + offset) } print(AcaS_comb) }
如果更倾向于R的向量化风格(比显式循环更高效,本质是隐式循环),可以这样写:
AcaS_Sem <- function(RptYr) { sems <- c("Spring", "Fall", "Summer") offsets <- c(-1, -2, -2) AcaS_comb <- paste0(sems, " ", RptYr + offsets) print(AcaS_comb) }
优化Enroll_Dem
同样先梳理学期和年份偏移的对应关系,再用循环实现:
Enroll_Dem <- function(RptYr) { # 定义所有需要的学期和年份偏移 sem_year_map <- list( c("Fall", 0), c("Summer", 0), c("Spring", 0), c("Fall", -1), c("Summer", -1), c("Spring", -1), c("Fall", -2) ) Enroll_vec <- character(length(sem_year_map)) # 循环生成每个条目 for (i in seq_along(sem_year_map)) { sem <- sem_year_map[[i]][1] offset <- as.integer(sem_year_map[[i]][2]) Enroll_vec[i] <- paste0(sem, " ", RptYr + offset) } print(Enroll_vec) }
向量化版本(更简洁高效):
Enroll_Dem <- function(RptYr) { sems <- c("Fall", "Summer", "Spring", "Fall", "Summer", "Spring", "Fall") offsets <- c(0, 0, 0, -1, -1, -1, -2) Enroll_vec <- paste0(sems, " ", RptYr + offsets) print(Enroll_vec) }
说明
- 循环版本的优势是当需要新增/修改学期条目时,只需修改
sem_year_map列表,无需重复写paste0语句,维护性更强。 - R语言中向量化操作通常比显式循环效率更高,推荐优先使用向量化写法,R会在底层做优化处理。
内容的提问来源于stack exchange,提问作者asokol
相关产品推荐
相关产品推荐

