【问题标题】:for.loop with WAV files带有 WAV 文件的 for.loop
【发布时间】:2025-12-12 19:15:01
【问题描述】:

我正在尝试创建一个循环以读取 R 中的立体声波文件,但我不确定是否应该使用 for.loop 或 while.loop。我正在计算两个通道的 RMS。

这是一个声音文件的操作:

foo=readWave("mysound.wav")
L=foo@left
R=foo@right
rms(L)
rms(R)

现在,我的目录中充满了 2 分钟的声音文件。我想获取这些文件中的每一个,隔离通道并计算 RMS。我认为这就是它的完成方式:

mydir=list.files("directory", recursive=TRUE) 
for (i in 1:length(mydir)) {
    foo=readWave(mydir[i])
    L=foo@left
    R=foo@right
    rms(L)
    rms(R)
    write(combine, file="test.txt", append=true, sep="\t")  
}

此循环返回我的第一个声音文件不存在的错误消息。根据以下建议,我还尝试通过以下方式读取文件:

wav_files <- lapply(mydir, readWave)
Error in FUN(c("DASBR2_20131112$224708.wav", "DASBR2_20131112$224910.wav",  : 
   File 'DASBR2_20131112$224708.wav' does not exist.

这也返回我的文件不存在。也许有更好的方法来读取波形文件? lapply 或 for.loop 可以处理波浪吗?

当我在控制台中输入 mydir 时,R 会产生以下输出:

> mydir
   [1] "DASBR2_20131112$224708.wav" "DASBR2_20131112$224910.wav"
   [3] "DASBR2_20131112$225110.wav" "DASBR2_20131112$225310.wav"
   [5] "DASBR2_20131112$225446.wav" "DASBR2_20131112$225648.wav"
   ...

这是我所期望的,因为这些是我的声音文件的名称。想法?

【问题讨论】:

  • 请为编程语言添加适当的标签。
  • 对不起!我刚刚在 R 区。
  • 欢迎来到*!查看您的个人资料显示您已经提出了一些问题,但您尚未投票或接受您收到的任何答案。也许看看this link regarding what to do when someone answers your question
  • 当您在 R 控制台中输入 mydir 时,输出是什么?是您期望的文件名或文件路径吗?这对我来说是一种盲目的故障排除。当我预期的文件名向量存储在 mydir 中时,在我的机器上运行 lapply(mydir, readWave)。

标签: r for-loop wav


【解决方案1】:

我认为您可能只需要从当前目录获取文件的完整路径。

mydir <- list.files("directory", recursive=TRUE, full.names=TRUE)

或者,您可以在list.files 之后但在阅读它们之前更改目录。

setwd("directory")

【讨论】:

  • 好的!设置 full.names=TRUE 似乎解决了最初的问题!谢谢亚伦!但是,现在我的内存用完了,而且我已经把设置用完了。 :( 一个问题解决了,另一个问题出现了....
【解决方案2】:

我是这样做的:

fnam=file.path("directory path")
filist=list.files(fnam, recursive=TRUE, pattern="wav")
filist1=paste(fnam, "/", filist, sep="")
nfiles=length(filist1)
test_rms=c("Full File Path", "RMS-L","RMS-R")
for (i in 1:nfiles){
     inname=filist1[i]
     ywave=readWave(inname)
     L=ywave@left
     R=ywave@right
     test_rms = rbind(test_rms, c(inname, rms(L), rms(R)))
 }

RMS 代码可以替换为您需要执行的任何流程。我会说代码无法通过我的整个目录运行,因为我可能有子目录。距离我指定的路径至少有两个深度。这段代码进入了一层,并读取了该目录中的所有内容,甚至是进一步子目录中的 wav 文件。我认为这个脚本只能处理两个目录。

【讨论】:

    【解决方案3】:

    我的第一个想法是使用lapply 来读取文件。类似这样的东西:

    wav_files <- lapply(mydir, readWave)
    

    然后我会使用lapply 遍历生成的 Wave 对象列表,以完成任务的其余部分。

    这样的方法可以用于提取频道并使用rms 函数:

    right_rms <- lapply(wave_files, function(x)rms(x@right)) 
    

    【讨论】:

    • 哦!喜欢单独创建函数而不是运行循环函数?
    • 谢谢你,弗兰克。解决内存问题后,我将尝试您的第二个建议。