1

我有大量 .wav 文件,我需要使用 R 中的“soundecology”包中的声学指数进行分析。但是,录音没有统一的开始时间,我需要分析文件中的特定时间段。我想创建一个函数和循环来自动化这个过程。我为每个录音文件夹(每个文件夹位于不同的位置)创建了一个电子表格,其中列出了录音以及我需要分析的每个录音中的时间。基本上,一行包含:声音文件名、样本应该开始的时间(例如 09:00:00、从文件开始到该时间发生的秒数以及从开始开始的秒数样本结束的文件时间。该数据如下所示: Spread sheet of data

我正在使用包“tuneR”和“warbleR”来选择我想要分析的声音文件的特定部分。这是我想在所有声音文件中循环的代码和输出:

wavrow1 <-read_wave(mvb$sound.files[1], from = mvb$start[1], to = mvb$end[1]) wavrow1.aci <- acoustic_complexity(wavrow1, j=10)

哪个产生

     max_freq not set, using value of: 22050 


 min_freq not set, using value of: 0 


 This is a mono file.

 Calculating index. Please wait... 

  Acoustic Complexity Index (total): 934.568

但是,当我将它放入一个函数中以便将其放入一个循环中时,我会得到不同的输出。

acianalyzeFUN <- function(mvb, i){
  r <- read_wave(mvb$sound.files[i], mvb$start[i], mvb$end[i])
  soundfile.aci <- acoustic_complexity(r, j=10)
}

row1.test <- acianalyzeFUN(mvb, 1)

这给出了输出:

max_freq not set, using value of: 22050 


 min_freq not set, using value of: 0 


 This is a mono file.

 Calculating index. Please wait... 

  Acoustic Complexity Index (total): 19183.03

  Acoustic Complexity Index (by minute): 931.98

这是不同的。所以我需要修复这个函数并将其放入一个循环中,以便我可以将它应用于所有文件并将结果保存到数据框或最终保存到另一个电子表格中。

我在想像下面这样的循环可能会起作用,但我也遇到了错误:

output <- vector("logical", length(97)) 
for (i in seq_along(mvb$sound.files)) {     
  output[[i]] <- acianalyzeFUN(mvb, i) 
}

返回此错误:

max_freq not set, using value of: 22050 


 min_freq not set, using value of: 0 


 This is a mono file.

 Calculating index. Please wait... 

  Acoustic Complexity Index (total): 19183.03

  Acoustic Complexity Index (by minute): 931.98

Error in output[[i]] <- acianalyzeFUN(mvb, i) : 
  more elements supplied than there are to replace

感谢您对此的任何帮助和建议。如果还有其他有用的信息,请告诉我。

4

1 回答 1

0

read_wave函数采用以下参数:

read_wave(X, index, from = X$start[index], to = X$end[index], channel = NULL, header = FALSE, path = NULL)

在手动测试中,您指定from = mvb$start[1], to = mvb$end[1]

在您创建的函数中,您没有指定参数:

r <- read_wave(mvb$sound.files[i], mvb$start[i], mvb$end[i])

这样mvb$start[i]会影响到 index 和 mvb$end[i] 到from. 你应该写:

acianalyzeFUN <- function(mvb, i){
  r <- read_wave(mvb$sound.files[i], from = mvb$start[i], to = mvb$end[i])
  soundfile.aci <- acoustic_complexity(r, j=10)
}

这应该可以解释您观察到的差异。

关于错误,您创建了一个逻辑向量来收集结果,但 acianalyzeFUN 什么也不返回:它只是设置了两个变量r并且soundfileaci不返回任何内容。

于 2020-06-12T16:50:50.650 回答