You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用循环优化两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:55:26