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 file.
library(tuneR)
dir.create("New files")
FILES<-list.files(PATH, pattern = "audio", recursive = TRUE)
for(i in 1:length(FILES)){
OneMIN <- readWave(FILES[i], from = 0, to = 60, units = "seconds")
writeWave(OneMIN, filename = (file=paste0(FILES[i], "_1-min.wav")))
}
Now, there are a couple of things wrong with this;
1) The new files are called e.g. "File1.wav_1-min.wav", so that I need to rename them to "File_1-min.wav"
2) The new files are in multiple subfolders, and I have to then copy them to the "New files" folder using additional steps outside the loop.
I have workarounds to resolve these issues, but I'm sure there is a more elegant way to do this, by including additional lines in the loop. I would like to:
1) Strip out the first '.wav' in the file name
2) Automatically save them to the "New files" folder
However, I don't have an idea about how to go about this. Any suggestions are appreciated. Thanks.
The
file.path()
function can be used to combined directories and filenames into a single filepath, while thesub()
function will allow you to easily modify the filenames: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:
and:
This will ensure that both
infile
andoutfile
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.
As both implied, I was getting errors because of issues with the paths. I didn't need
full.names = TRUE
in theFILES
assignment, but I did need to includebasename()
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.