【问题标题】:Assign, Save and Load a Sequence of Objects to a Sequence of Variables in R将对象序列分配、保存和加载到 R 中的变量序列
【发布时间】:2015-10-27 14:19:05
【问题描述】:

我想将一系列结果分配给一系列变量,然后将这些变量保存在一系列 .Rdata 文件中。我想这样做是为了在需要时使用 sapply 加载所有 .Rdata 文件。
为了说明我的问题,我写了一个简单的函数save.try1,并运行了5次。

save.try1 = function(x){

M = matrix(c(x,x+1,x+2,x+3), ncol=2, nrow = 2)

filename = paste('/Volumes/GIORDANO 3/MTS/MTS - essai/matrice', x, '.Rdata', sep='')

save(M, file =filename) 

}

sapply(1:5, save.try1)

我的文件夹 MTS - essai 中现在有 5 个名为 matrice1.Rdata, ... , matrice5.Rdata 的 .Rdata 文件。

现在,当我在 R 中加载文件时,我得到:

> matrices.chargees = sapply(1:5, function(x) load(file = paste('/Volumes/GIORDANO 3/MTS/MTS - essai/matrice', x, '.Rdata', sep='')))
> matrices.chargees
[1] "M" "M" "M" "M" "M"

而且我无法打开任何 M 矩阵:

> matrices.chargees[[2]]
[1] "M"
> matrices.chargees[2]
[1] "M"
> matrices.chargees$M
Error in matrices.chargees$M : $ operator is invalid for atomic vectors  

首先,我想为每个矩阵指定不同的名称。我读了以下帖子:

how to assign a sequence of computations to a sequence of variables in r

我尝试将代码更改为:

save.try1 = function(x){

M = matrix(c(x,x+1,x+2,x+3), ncol=2, nrow = 2)

assign(paste('M', x, sep =''), M)

filename = paste('/Volumes/GIORDANO 3/MTS/MTS - essai/matrice', x, '.Rdata', sep='')

save(paste('M', x, sep =''), file =filename) 

}  

但我收到以下错误:

> sapply(1:5, save.try1)
Error in save(paste("M", x, sep = ""), file = filename) : 
  object ‘paste("M", x, sep = "")’ not found

因此,我的问题如下:

1- 如何修改我的代码以使每个矩阵具有不同的名称? 2- 这可以让我访问每个矩阵的内容吗?如果没有,我该如何访问它?

谢谢!

【问题讨论】:

  • 不要使用assign。只需制作一个列表并使用[[ 分配:mylist <- list(); mylist[[myname]] <- mything_for_myname。我怀疑您是否需要保存在函数中;只需在填充后保存mylist,或者如果必须保存在循环中。我想重要的是你可以在[[]] 中输入一个数字或一个名字

标签: r


【解决方案1】:

除非您确切知道自己在做什么,否则请不要在作业中使用 =。

这是您的函数的工作版本。你需要告诉save你的参数是一个变量名作为一个字符串而不是一个符号:

save.try1 <- function(x){
    M <- matrix(c(x,x+1,x+2,x+3), ncol=2, nrow = 2)

    foo <- paste('M', x, sep ='')

    assign(foo, M)

    filename <- paste('ENTER_YOUR_PATH_HERE', x, '.Rdata', sep='')

    save(list=foo, file=filename) 
}

话虽如此,我真的怀疑在这里使用函数而不是 for 循环是好的风格。函数应该返回一个值结构,而不是像这个 sapply 调用那样的 NULL 列表。即使在 R 中也喜欢你的 for 循环,它们的存在是有原因的。

【讨论】:

    【解决方案2】:

    您的加载脚本中还有一个小错误。加载返回创建的对象名称的字符向量,不可见。(参见?load)。

    因此,通过一些小的修复,它将按预期加载矩阵:

    matrices.chargees = sapply(1:5, function(x) {
      name <- load(file = paste('matrice', x, '.Rdata', sep=''))
      out <- list(get(text=name))
      names(out) <- name
      out })
    

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多