有没有办法自动更改我的文件路径并在R中应用函数?

有没有办法自动更改我的文件路径并在R中应用函数?,r,loops,wav,acoustics,R,Loops,Wav,Acoustics,我希望使用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",

我希望使用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")
这是可行的,但目前我每次都必须为每个文件夹(有623个)复制和粘贴代码,所以手动执行这项操作非常耗时

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


提前感谢

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

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()

生成目录列表。我建议您编写一个实用函数,并将目录用作输入:

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()

生成目录列表。您可以使用
list.files
提前获取文件列表,您可以使用
paste()
sprintf
glue::glue
以编程方式创建文件路径…您可以使用
list.files
提前获取文件列表,您可以使用
paste()
sprintf
glue::glue
以编程方式创建文件路径…非常感谢您的帮助,我非常感谢!但是你能不能向一个完全的初学者解释一下我还需要输入什么才能让它工作,因为我已经运行了代码,但它没有做任何事情,我希望这是因为我需要对代码进行一些修改,但我对R非常陌生。我真诚地为我的无能道歉。第一个代码块定义了一个函数。除了在您的工作区中创建
apply\u wav\u index
函数外,它不会尝试执行任何操作。以(1:6中的i)开头的第二个代码块在
…Emma/_1
../Emma/_2
,…,
…Emma/_6
上运行函数。它应该可以工作,创建输出文件。(检查文件上的时间戳以查看它们是否被重新创建。)如果它适用于
i in 1:6
,那么您可以尝试将其编辑为
i in 7:623
,或者无论您有多少个文件。当我运行
for(i in 1:6)
部分时,我在“apply_wav_index(dir=paste0(”E:/Audiomoth Files/Winter/Rural/Emma/u“,i,no_cores=“-2”)}”我试图删除
}
但R似乎什么也没做……这可能是因为
多音
函数运行时间太长吗?不,这是一个语法错误,因为我无法在没有任何测试的情况下测试代码。我错过了一个
,现在应该可以修复了。非常感谢您的帮助,我非常感谢!但是你能不能向一个完全的初学者解释一下我还需要输入什么才能让它工作,因为我已经运行了代码,但它没有做任何事情,我希望这是因为我需要对代码进行一些修改,但我对R非常陌生。我真诚地为我的无能道歉。第一个代码块定义了一个函数。除了在您的工作区中创建
apply\u wav\u index
函数外,它不会尝试执行任何操作。以(1:6中的i)开头的第二个代码块在
…Emma/_1
../Emma/_2
,…,
…Emma/_6
上运行函数。它应该可以工作,创建输出文件。(检查文件上的时间戳以查看它们是否被重新创建。)如果它适用于
i in 1:6
,那么您可以尝试将其编辑为
i in 7:623
,或者无论您有多少个文件。当我运行
for(i in 1:6)
部分时,我在“apply_wav_index(dir=paste0(”E:/Audiomoth Files/Winter/Rural/Emma/u“,i,no_cores=“-2”)}”我试图删除
}
但R似乎什么也没做……这可能是因为
多音
函数运行时间太长吗?不,这是一个语法错误,因为我无法在没有任何测试的情况下测试代码。我错过了一个
,应立即修复。