【问题标题】:R - How to avoid loop in list of filesR - 如何避免文件列表中的循环
【发布时间】:2015-05-15 04:09:58
【问题描述】:

我目前在 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 循环并使代码更高效/更易读?

【问题讨论】:

  • 这里,您只使用 R 来运行系统工具(即 cdo)。在我看来,直接使用 shell 脚本可能更有效。
  • @Pascal,这段代码实际上是一段摘录。实际上,我有更多的东西进入循环,直到它到达这一点。但是所有其他命令也涉及循环中的索引,所以如果我了解消除循环背后的逻辑,我将能够在我的实际脚本中使用它。
  • 我只是表示你可以通过预处理来删除所有不必要的系统调用来简化你的 R 代码。当然,这取决于你。

标签: r for-loop


【解决方案1】:

这更符合 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)

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

【讨论】:

    猜你喜欢
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多