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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:55:23