我想将一系列结果分配给一系列变量,然后将这些变量保存在.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-这是否允许我访问每个矩阵的内容?如果没有,我该如何访问它?
谢谢!
答案 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 })