如何在R函数内部更新全局环境中的列表对象?
在R函数内部更新全局环境中的列表对象失败问题
我需要在R函数内部更新全局环境中的列表对象,但尝试的代码无法正常工作,完整可执行代码如下:
require(rlang) (my_list <- list(a = 1, b = "two", c = "set outside")) print( paste("my_list$c is" , my_list$c) ) my_function <- function(x = 1, y = 2, parent_object_name = "my_list") { z <- x + y # 无关的业务逻辑 some_names <- "updated inside" upper_env_object_name <- paste0(parent_object_name, "$c") # browser() # env_poke(env = env_tail(), upper_env_object_name, some_names) # 无效 # env_poke(env = env_parents()[[1]], upper_env_object_name, some_names) # 无效 env_poke(env = caller_env(), upper_env_object_name, some_names ) # 创建了`my_list$c`字符向量而非更新原列表 # force(env_poke(env = caller_env(), upper_env_object_name, some_names )) # 同样创建新对象 # browser() # env_poke(env = caller_env(), paste0("as.list(",upper_env_object_name,")"), some_names) # 创建`as.list(my_list$c)`字符向量 return(z) } my_function(x = 1, y = 2, parent_object_name = "my_list") print(class(`my_list$c`)) print( `my_list$c`) print( paste("my_list$c is" , my_list$c) )
我尝试过使用rlang的env_poke函数(调整多种环境参数),也试过assign函数并指定环境,但都无法成功更新原列表中的元素——当前代码只会在全局环境中创建一个名为my_list$c的新字符向量,而不是修改原列表my_list的c元素。
背景说明
我有一些S3子类,希望通过一个列表类型的父类对象来跟踪这些子类的状态。子类是"按需创建"的,我需要随时查看已创建的子类内容。目前的临时解决方案是在全局环境中创建一个新向量,通过以下代码更新:
if (exists("global_names_list")) global_names_list <<- unique(rbind(global_names_list, some_names)) else global_names_list <<- some_names
内容的提问来源于stack exchange,提问作者4554888
相关产品推荐
相关产品推荐

