我正在尝试在循环中使用saveRDS,我有一个名为XDATA的列表,其中包含21个矩阵,还有一个名为name的列表,其中包含21个要在其中保存这些矩阵的名称。这是我尝试过的两个解决方案,但均无效:
for (i in 1:21) {
assign(names[i],XDATA[[i]])
saveRDS(as.name(names[i]),file = paste(names[i],'.RDS',sep=''),compress=TRUE)
}
Run Code Online (Sandbox Code Playgroud)
这只会保存一个1kb的文件,其中包含符号as.name(names [i])。我的第二次尝试是:
for (i in 1:21) {
assign(names[i],XDATA[[i]])
eval(parse(paste('saveRDS(',names[i],",file=paste(names[i],'.RDS',sep=''),compress=TRUE)", sep="")))
}
Run Code Online (Sandbox Code Playgroud)
这将导致以下错误:
file(filename,“ r”)中的错误:无法打开连接另外:警告消息:在file(filename,“ r”)中:无法打开文件'saveRDS(Sub_502,file = paste(names [1],')”。 RDS',sep =''),compress = TRUE)':没有这样的文件或目录
我希望能为该问题提供一个可行的解决方案,也许是一个解释,尽管语法似乎很合理,但为什么在第一个解决方案中使用as.name传递却失败了。
谢谢!
你可能应该做
for (i in 1:21) {
assign(names[i],XDATA[[i]])
saveRDS(get(names[i]),file = paste(names[i],'.RDS'),compress=TRUE)
}
Run Code Online (Sandbox Code Playgroud)
您传递给的第一个对象saveRDS必须是您要保存的对象,而不仅仅是其名称。“名称”是一种变量类型,您也可以保存;它与对象本身不同。在此,get()返回给定对象名称的字符版本的对象的值。
我不完全确定为什么您仍然要为此烦恼assign()。与with不同save()/load(),saveRDS它不保留对象名称。你可以做
for (i in 1:21) {
saveRDS(XDATA[[i]],file = paste(names[i],'.RDS'),compress=TRUE)
}
Run Code Online (Sandbox Code Playgroud)