R - 如何避免文件列表中的循环

thi*_*oso 5 for-loop r

我目前在R中的学习目标是避免for循环.我经常需要列出目录中的文件(或循环目录)来对这些文件执行各种操作.

我的任务的一个例子如下:我必须调用一个名为cdo合并两个文件的系统应用程序.这个命令的语法是,比方说:cdo merge input_file1 input_file2 output_file.

我目前的R代码如下所示:

# set lists of files
u.files <- c("uas_Amon_ACCESS1-3.nc", "uas_Amon_CMCC-CESM.nc", "uas_Amon_CMCC-CESM.nc")
v.files <- c("vas_Amon_ACCESS1-3.nc", "vas_Amon_CMCC-CESM.nc", "vas_Amon_CMCC-CESM.nc")

for (i in 1:length(u.files)) {

  # set input file 1 to use on cdo
  input1 <- paste(u.files[i], sep='')

  # set input file 2 to use on cdo
  input2 <- paste(v.files[i], sep='')

  # set output file to use on cdo
  output <- paste('output_', u.files[i], sep='') 

  # assemble the command string 
  comm <- paste('cdo merge', input1, input2, output, collapse='')

  # submit the command
  system(comm)

}
Run Code Online (Sandbox Code Playgroud)

虽然看起来不那么好但效果还不错.

但是,我经常听到人们说forR中的循环很慢,应该尽可能避免.

有没有办法避免for循环,并使代码在这种情况下更有效/清晰?

nic*_*ola 3

这更符合 R 语言习惯:

u.files <- c("uas_Amon_ACCESS1-3.nc", "uas_Amon_CMCC-CESM.nc", "uas_Amon_CMCC-CESM.nc")
v.files <- c("vas_Amon_ACCESS1-3.nc", "vas_Amon_CMCC-CESM.nc", "vas_Amon_CMCC-CESM.nc")
output <- paste('output_', u.files, sep='')
comm <- paste('cdo merge', u.files, v.files, output)
lapply(comm,system)
Run Code Online (Sandbox Code Playgroud)

请记住,大多数函数在 R 中都是矢量化的,因此您不必调用paste循环中的每次迭代。最后,您将获得一个命令向量并lapply在最后一行中逐一执行。