我目前在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)
}
虽然看起来不那么好但效果还不错。
但是,我经常听到人们说R中的for
循环很慢,应该尽可能避免。
有没有办法避免for循环并使代码在这种情况下更有效/清晰?
答案 0 :(得分:2)
这更像是R-idiomatic:
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)
请记住,大多数函数都在R中进行了矢量化,因此您不必为循环中的每次迭代调用paste
。最后,您将获得一个命令向量,并在最后一行中逐个lapply
执行。