首页 > 解决方案 > 函数内列表元素的全局分配,使用列表的变量名

问题描述

标题有点松。我想创建一个将列表名称作为变量的函数,并将元素分配给该列表。到目前为止,我可以通过my_fun函数中的名称访问列表的元素。然后我可以修改函数中的列表(使用函数参数),并print验证分配是否有效。当然,我没有将这些保存到全局环境中,所以当我在函数之外调用列表时,它并没有改变。

my_list <- list('original_element')

my_fun <- function(some_list) {

    # check that I can access the list using the parameter name
    print(some_list[[1]])

    # modify the list
    some_list[[1]] <- 'element_assigned_in_function'

    # check that the list was modified
    print(some_list[[1]]) 

}

my_fun(my_list)

# [1] "original_element"
# [1] "element_assigned_in_function"

# of course, my_list hasn't been modified in the global environment
my_list
# [[1]]
# [1] "original_element"

我的问题是,您如何在函数中将新元素分配给该列表并将它们存储在全局环境中?如果我只是尝试使用 将赋值设为全局<<-,则会引发以下错误:

some_list [[1]] <<-“element_assigned_in_function”中的错误:找不到对象“some_list”

我尝试使用assign和 set envir = .GlobalEnv,但这不起作用,我认为assign不能与列表元素一起使用。我怀疑可能有一些引用/取消引用/使用表达式来使其工作,但我无法弄清楚。谢谢你。

标签: r

解决方案


首先,我要明确一点,我不鼓励在全局环境中从函数内部为变量赋值。理想情况下,您应该始终return使用要更改的函数的值。但是,仅出于演示目的,这里是一种您可以从函数内部更改列表内容的方法

my_fun <- function(some_list) {
  list_name <- deparse(substitute(some_list))
  some_list[[1]] <- 'element_assigned_in_function'
  assign(list_name, some_list, .GlobalEnv)
}

my_list <- list('original_element')
my_fun(my_list)
my_list
#[[1]]
#[1] "element_assigned_in_function"

推荐阅读