将变量重新分配给列表

时间:2015-12-02 20:40:48

标签: r assign

我在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.

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

假设您是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