如何进入R中for循环的下一次迭代?

时间:2017-05-26 16:14:33

标签: r

我正在尝试读取具有不同名称的CSV文件。 在我的for循环中,使用不同的i值,它会检查文件并导入文件。有一些i的值,它与任何文件名都没有关联。

在这里,我的问题是如何进入下一次迭代? 提前谢谢!

for (i in 17:23)
{
  path= file.path(paste0("2017-02-23 ", i, "_00_00/Registrations.csv"))
  if(!file.exists(path))
  data= read.table(path, header = F,    sep=",")
  datalist= list(data)
  else print(NA)
}





> for (i in 17:23)
+ {
+   path= file.path(paste0("2017-02-23 ", i, "_00_00/Registrations.csv"))
+   if(!file.exists(path))
+   data= read.table(path, header = F,  sep=",")
+   datalist= list(data)
+ }
Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") :
  cannot open file '2017-02-23 19_00_00/Registrations.csv': No such file or directory

1 个答案:

答案 0 :(得分:3)

您可以使用next

datalist = list()
for (i in 17:23) {
  file = paste0("2017-02-23 ", i, "_00_00/Registrations.csv")
  path = file.path(file)
  if(!file.exists(path)) {
     next
  }
  data = read.table(path, header = F, sep = ",")
  datalist[[file]] = data
}

我有

  • 使用next跳过文件不存在的迭代
  • 初始化列表并按名称将文件添加到列表
  • 摆脱了无用的print(NA)行。

但是这更有效地做同样的事情(我会说,更清楚):

paths = file.path(paste0("2017-02-23 ", 17:23, "_00_00/Registrations.csv"))
extant_paths = paths[file.exists(paths)]
datalist = lapply(extant_paths, read.table, header = FALSE, sep = ",")

pastefile.pathfile.exists都是矢量化的,因此一次性使用它们会更容易,更快捷。需要在循环中的唯一操作是read.csv。在这里,我们使用lapply作为方便的语法而不是for循环 - 它节省了我们需要初始化list并手动为其分配元素。