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

时间:2016-09-09 21:27:50

标签: r lapply 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"

2 个答案:

答案 0 :(得分:5)

好问题,这可能不是理想的答案。无论如何,一种可能性是将列表用作环境并将其与list中的save()参数耦合。这里的关键是使订单正确,因为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

答案 1 :(得分:4)

这是我的尝试:

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