如何在对象名称作为变量传递的循环中使用saveRDS-R

Ser*_*imz 3 r

我正在尝试在循环中使用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传递却失败了。

谢谢!

MrF*_*ick 5

你可能应该做

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)