【问题标题】:Is there a way to change my file path automatically and apply a function in R?有没有办法自动更改我的文件路径并在 R 中应用函数?
【发布时间】:2021-04-22 15:38:31
【问题描述】:

我希望使用 R 将“multiple_sounds”函数应用于文件夹中的 .WAV 文件列表。这是我当前的代码:

##### 1 #####
setwd("E:/Audiomoth Files/Winter/Rural/Emma/_1")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_1", resultfile = "ndsi_results.csv", soundindex = "ndsi", no_cores = "-2")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_1", resultfile = "adi_results.csv", soundindex = "acoustic_diversity", no_cores = "-2")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_1", resultfile = "aei_results.csv", soundindex = "acoustic_evenness", no_cores = "-2")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_1", resultfile = "aci_results.csv", soundindex = "acoustic_complexity", no_cores = "-2")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_1", resultfile = "H_results.csv", soundindex = "bioacoustic_index", no_cores = "-2")

##### 2 #####
setwd("E:/Audiomoth Files/Winter/Rural/Emma/_2")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_2", resultfile = "ndsi_results.csv", soundindex = "ndsi", no_cores = "-2")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_2", resultfile = "adi_results.csv", soundindex = "acoustic_diversity", no_cores = "-2")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_2", resultfile = "aei_results.csv", soundindex = "acoustic_evenness", no_cores = "-2")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_2", resultfile = "aci_results.csv", soundindex = "acoustic_complexity", no_cores = "-2")
multiple_sounds(directory = "E:/Audiomoth Files/Winter/Rural/Emma/_2", resultfile = "H_results.csv", soundindex = "bioacoustic_index", no_cores = "-2")

这可行,但目前我必须为每个文件夹(_1、_2、_3 等)每次复制并粘贴此代码,其中有 623 个,因此手动执行此操作非常耗时。

有没有一种方法可以自动更改文件路径以自动将目录更改为 _3、_4、_5 并将函数循环应用到第 623 个文件夹?

提前谢谢你

【问题讨论】:

  • 您可以使用list.files提前获取文件列表,您可以使用paste()sprintfglue::glue以编程方式创建文件路径...

标签: r loops wav acoustics


【解决方案1】:

我建议编写一个实用函数并将目录用作输入:

apply_wav_index = function(
  dir,
  index = c("ndsi", "acoustic_diversity", "acoustic_evenness", "acoustic_complexity", "bioacoustic_index"),
  labels = c("ndsi", "adi", "aei", "aci", "H"),
  ...
) {
  if(length(index) != length(labels)) stop("Must provide same number of labels and indexes")
  for(i in seq_along(index)) {
    multiple_sounds(
      directory = dir,
      resultfile = paste0(dir, "/", labels[i], "_results.csv"),
      soundindex = index[i],
      ...
    )
  }
}

那么你应该可以这样称呼它:

for(i in 1:6) {
  apply_wav_index(dir = paste0("E:/Audiomoth Files/Winter/Rural/Emma/_", i), no_cores = "-2")
}

您还可以使用list.dirs() 生成目录列表。

【讨论】:

  • 非常感谢您的帮助,我非常感谢!但是你能否向一个完整的初学者解释一下我还需要输入什么才能让它工作,因为我已经运行了代码但它没有做任何事情,我希望它是因为我需要稍微改变代码但我已经对 R 来说非常陌生。我真诚地为我的无能道歉。
  • 第一个代码块定义了一个函数。除了在您的工作区中创建 apply_wav_index 函数之外,它不会尝试做任何事情。以for(i in 1:6) 开头的第二个代码块在...Emma/_1.../Emma/_2、...、...Emma/_6 上运行函数。它应该可以工作,创建您的输出文件。 (检查文件上的时间戳以查看它们是否被重新创建。)如果它适用于 i in 1:6,那么您可以尝试将其编辑为 i in 7:623,或者您拥有的任何文件。
  • 当我运行for (i in 1:6) 部分时,我收到此消息Error: unexpected '}' in: " apply_wav_index(dir = paste0("E:/Audiomoth Files/Winter/Rural/Emma/_", i, no_cores = "-2") }" 我试图删除} 但R 似乎什么也没做...可能是因为multiple_sounds函数只是需要很长时间才能运行?
  • 不,这是一个语法错误,因为没有任何东西可以测试,我无法测试代码。
  • 我错过了),现在应该修复了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2011-05-05
相关资源
最近更新 更多