【问题标题】:preserve name of list element when saving using mapply使用 mapply 保存时保留列表元素的名称
【发布时间】:2016-09-09 21:27:50
【问题描述】:

我正在使用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"

【问题讨论】:

    标签: r lapply mapply


    【解决方案1】:

    好问题,这可能不是理想的答案。无论如何,一种可能性是将列表用作环境并将其与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
    

    【讨论】:

      【解决方案2】:

      这是我的尝试:

      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
      

      【讨论】:

        猜你喜欢
        • 2020-10-07
        • 2020-07-08
        • 1970-01-01
        • 2012-09-20
        • 2012-12-12
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 2021-01-30
        相关资源
        最近更新 更多