求助:在R语言循环中通过字符串引用对象并赋值的方法
R语言循环中给独立对象添加注释的正确方法
你遇到的核心问题是:直接循环列表中的对象时,操作的是原对象的副本,而非原对象本身,所以注释只会被赋给循环中的临时变量,不会影响全局环境里的obj1、obj2。
原代码的问题验证
my_comment <- paste0("these objects were created on ", date()) obj1 <- "content1" obj2 <- "content2" obj_l <- list(obj1, obj2) for(obj in obj_l) { comment(obj) <- my_comment } # 原对象注释仍为NULL comment(obj1) # 列表本身无注释 comment(obj_l) # 仅临时变量`obj`被赋值 comment(obj)
解决方案1:基于对象名字符向量的循环(对应你的伪代码)
直接用对象名的字符向量,结合get()和assign()操作全局环境中的原对象:
my_comment <- paste0("these objects were created on ", date()) obj1 <- "content1" obj2 <- "content2" # 用对象名的字符向量代替值的列表 obj_names <- c("obj1", "obj2") for(name in obj_names) { # 获取原对象 current_obj <- get(name) # 添加注释 comment(current_obj) <- my_comment # 将修改后的对象重新赋值回全局环境 assign(name, current_obj) } # 验证结果 comment(obj1) comment(obj2)
解决方案2:用函数式编程简化操作
如果不想写循环,也可以用lapply结合assign批量处理:
my_comment <- paste0("these objects were created on ", date()) obj1 <- "content1" obj2 <- "content2" obj_names <- c("obj1", "obj2") lapply(obj_names, function(name) { obj <- get(name) comment(obj) <- my_comment assign(name, obj, envir = .GlobalEnv) }) # 验证 comment(obj1)
关键说明
get(name):通过字符形式的对象名,从指定环境(默认全局环境)中获取对象assign(name, value):将修改后的对象重新赋值回对应名字的变量,确保修改生效- 不要直接循环对象值的列表,因为R中大多数对象是值传递,循环变量是原对象的拷贝,修改拷贝不会影响原对象
内容的提问来源于stack exchange,提问作者mikemtnbikes
相关产品推荐
相关产品推荐

