将变量重新分配给列表的元素

Reassign variables to elements of list

我在 R 中有一个对象列表,我使用 lapply 对其执行不同的操作。但是,在下一步中,我只想将函数应用于列表的某些元素。因此,我想再次将列表拆分为 原始变量 。 R中有这个命令吗?甚至有可能,还是每次我想这样做时都必须创建新变量? 请参阅以下示例以明确我的意思:

# 3 vectors:
test1 <- 1:3
test2 <- 2:6
test3 <- 8:9

# list l:
l <- list(test1,test2,test3)

# add 3 to each element of the list:
l <- lapply(l, function(x) x+3)

# In effect, list l contains modified versions of the three test vectors

问题: 我怎样才能将这些修改重新分配给原始变量?我不想做:

test1 <- l[[1]]
test2 <- l[[2]]
test3 <- l[[3]]
# etc.

有更好的方法吗?

假设您是 R 的新手,一种更直观的方法可能是使用 for 循环。我确实认为 Richard Scriven 的方法更好。它至少更简洁。

for(i in seq(1, length(l))){
    name <- paste0("test",i)
    assign(name, l[[i]] + 3)
}

综上所述,您的最终目标有点可疑。我建议您将结果保存在列表或矩阵中,特别是如果您是 R 的新手。通过将所有结果包含在列表或矩阵中,您可以继续使用 lapply 之类的函数并 sapply 来操作您的结果.

Richard Scriven 在评论中的粗略说法是将列表中的每个元素转换为一个对象,然后将这些对象传递给封闭环境,在本例中为全局环境。他本可以将对象传递到任何环境。例如尝试

e <- new.env()
list2env(lapply(mget(ls(pattern = "test[1-3]")), "+", 3), e)

请注意,test1test2test3 现在位于环境 e 中。试试 e$test1ls(e)。更深入地研究括号,对 ls 的调用使用简单的正则表达式告诉 mget 要查找的对象的名称。有关更多信息,请查看 http://adv-r.had.co.nz/Environments.html.