这里有两个问题,我认为:
- 如何同时引用 a 中每个元素的名称(或索引)和值
list
;和
- 如何将数据从命名传输
list
到全局(或任何)环境。
1. 引用名称/索引与数据
使用 索引后,其中的for (i in directories)
完整上下文(索引、名称)将丢失。一些替代方案:i
directories
for (ix in seq_along(directories)) {
directories[[ix]] # the *value*
names(directories)[ix] # the *name*
ix # the *index*
# ...
}
for (nm in names(directories)) {
directories[[nm]] # the *value*
nm # the *name*
match(nm, names(directories)) # the *index*
# ...
}
如果您愿意使用Map
-like 函数(一种处理类似事物列表的更惯用的方式),那么
out <- Map(function(x, nm) {
x # the *value*
nm # the *name*
# ...
}, directories, names(directories))
out <- purrr::imap(directories, function(x, nm) {
x # the *value*
nm # the *name*
# ...
})
# there are other ways to identify the function in `purrr::` functions
match
注意:虽然在最后两个中使用来获取索引很容易,但这是一个轻微的范围违规,我希望在合理的情况下避免。它有效,我只是更喜欢替代方法。如果你想要值、名称和索引,那么
out <- Map(function(x, nm, ix) {
x # the *value*
nm # the *name*
ix # the *index*
# ...
}, directories, names(directories), seq_along(directories))
2. 转移列表到env
在您的问题中,您这样做是为了将列表中的变量分配到另一个环境中。关于这项工作的一些想法:
如果它们都相似(相同的结构,不同的数据),那么不要。将它们保存在 a 中list
,然后使用lapply
或类似方法对它们进行处理。(如何制作数据框列表?)
如果您确实需要将它们从列表移动到全局环境,那么list2env
这里可能很有用。
# create my fake data
directories <- list(a=1, b=2)
# this is your renaming step, rename before storing in the global env
# ... not required unless you have no names or want/need different names
names(directories) <- paste0("files_", names(directories))
# here the bulk of the work; you can safely ignore the return value
list2env(directories, envir = .GlobalEnv)
# <environment: R_GlobalEnv>
ls()
# [1] "directories" "files_a" "files_b"
files_a
# [1] 1