将对象序列分配,保存和加载到R中的变量序列

时间:2015-03-03 17:18:12

标签: r

我想将一系列结果分配给一系列变量,然后将这些变量保存在.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个.ddata文件名为 matrice1.Rdata,...,matrice5.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-这是否允许我访问每个矩阵的内容?如果没有,我该如何访问它?

谢谢!

2 个答案:

答案 0 :(得分: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循环,它们存在是有原因的。

答案 1 :(得分:0)

您的加载脚本中也有一个小错误。加载返回无形中创建的对象名称的字符向量。(参见?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 })