I have multiple audio files which are held in several subfolders in my working directory. I have a loop which reads in the first minute of each file and then saves them as a new
The file.path()
function can be used to combined directories and filenames into a single filepath, while the sub()
function will allow you to easily modify the filenames:
library(tuneR)
dir.create("New files")
FILES <- list.files(PATH, pattern = "audio", recursive = TRUE)
for(infile in FILES){
OneMIN <- readWave(infile, from = 0, to = 60, units = "seconds")
outfile <- file.path("New files", sub('.wav', '_1-min.wav', infile))
writeWave(OneMIN, filename=outfile)
}
Also, it's worth noting that in the original code sample, the list.files()
function will only return the filename part of each filepath.
Thus, you may need to modify your code to look something like:
FILES <- list.files(PATH, pattern = "audio", recursive = TRUE, full.names=TRUE)
and:
outfile <- file.path("New files", sub('.wav', '_1-min.wav', basename(infile)))
This will ensure that both infile
and outfile
are pointing to the correct locations.
Thought I would post my solution, which borrows from both @Keith Hughitt 's answer and @lmo 's comments. Thanks to both of them for helping work out what I needed.
for(i in 1:length(FILES)){
OneMIN <- readWave(FILES[i], from = 0, to = 60, units = "seconds")
FILE.OUT <- sub("\\.wav$", "_1 min.wav", FILES)
OUT.PATH <- file.path("New files", basename(FILE.OUT))
writeWave(OneMIN, filename = OUT.PATH[i])
}
As both implied, I was getting errors because of issues with the paths. I didn't need full.names = TRUE
in the FILES
assignment, but I did need to include basename()
in the loop.
As Keith demonstrated in his answer, the FILE.OUT
line is not strictly necessary, but it helps me to keep track of the different steps.