使用 mapply 保存时保留列表元素的名称

preserve name of list element when saving using mapply

我正在使用 mapply() 将列表中的元素保存在单独的文件中。例如。

file.names <- c('~/a.RData', '~/b.RData')
data.list <- list(foo = c(1:10), bar = rep(1, 10))

mapply(function(x, y) save(x, file = y), data.list, file.names)

并且我希望能够在再次加载元素后以其原始名称调用元素。现在我得到

load('~/a.RData')
ls()
"x"

但我想要

load('~/a.RData')
ls()
"foo"

问得好,这可能不是理想的答案。无论如何,一种可能性是将列表用作环境并将其与 save() 中的 list 参数相结合。这里的关键是获得正确的排序,因为 ls() 对其输出进行排序。 with() 从列表中创建一个环境,因此我们可以轻松地使用 list 参数。

with(data.list, {
    mapply(
        function(x, y) save(list = x, file = y),
        ls()[order(names(data.list))], 
        file.names
    )
})
# $foo
# NULL
#
# $bar
# NULL

检查:

load('~/a.RData')
ls()
# [1] "data.list"  "f"          "file.names" "foo"       
load('~/b.RData')
ls()
# [1] "bar"        "data.list"  "f"          "file.names" "foo"     
foo
# [1]  1  2  3  4  5  6  7  8  9 10
bar
# [1] 1 1 1 1 1 1 1 1 1 1

这是我的尝试:

mapply(function(x, y, z) {
  assign(y,x)
  save(list=y,file=z)
}, data.list, names(data.list), file.names)

让我们检查一下输出:

#rm(list=ls())
load('~/a.RData')
ls()
#[1] "foo"

load('~/b.RData')
ls()
[1] "bar" "foo"

foo
#[1]  1  2  3  4  5  6  7  8  9 10
bar
#[1] 1 1 1 1 1 1 1 1 1 1