如何通过循环或apply家族批量创建含对象与函数的R列表
动态创建列表对象与Setter函数的实现方案
核心思路
通过循环或函数式编程工具,批量处理object和objectClass向量,完成两项工作:初始化对应类型的列表对象、生成匹配的setter函数。
方案一:基础for循环实现
代码直观易懂,适合批量场景:
# 初始化空列表 lst <- list() # 遍历每个对象的索引 for (i in seq_along(object)) { # 生成对象名和setter函数名 obj_name <- paste0("Object", object[i]) setter_name <- paste0(".set", obj_name) # 初始化对应类型的空对象 lst[[obj_name]] <- do.call(objectClass[i], list()) # 创建setter函数 lst[[setter_name]] <- function(val) { # 从函数名中提取目标对象名 current_fn <- as.character(sys.call()[[1]]) target_obj <- sub("^\\.set", "", current_fn) # 修改外部环境的lst lst[[target_obj]] <<- val } }
方案二:purrr包的函数式实现
偏好函数式编程风格的话,用map2同步处理两个向量:
library(purrr) lst <- list() # 同步遍历object和objectClass map2(object, objectClass, function(obj_suffix, cls) { obj_name <- paste0("Object", obj_suffix) setter_name <- paste0(".set", obj_name) lst[[obj_name]] <<- do.call(cls, list()) lst[[setter_name]] <<- function(val) { current_fn <- as.character(sys.call()[[1]]) target_obj <- sub("^\\.set", "", current_fn) lst[[target_obj]] <<- val } })
关键细节说明
- 使用
lst[[name]]而非lst$name:动态生成的名称是字符串,[[支持字符串索引,$仅识别字面量名称 - 函数内用
<<-赋值:要修改外部环境(全局环境)中的lst,<-只会创建函数内部的局部变量 - 动态匹配目标对象:通过
sys.call()获取当前调用的函数名,再用sub截取对应的Object名称,避免每个函数写死目标,提升代码通用性
效果测试
# 调用setter函数赋值 lst$.setObjectD(456) lst$.setObjectE("hello") # 查看结果 lst$ObjectD #> [1] 456 lst$ObjectE #> [1] "hello"
内容的提问来源于stack exchange,提问作者Howard
相关产品推荐
相关产品推荐

