如何在多个文件或目录中的所有文件上运行相同的代码

时间:2014-05-19 19:45:10

标签: arrays r loops for-loop sox

所以我对编码很新,最近写了一个涉及R和sox的小程序。它看起来像这样

file <- "test.mp3"

testSox = paste("sox ",file," -n spectrogram -o ",file,".png stats",sep='')
sox = system(testSox, intern = TRUE)
print(sox)

现在,我不想在代码中手动分配一个文件,而是希望让这些代码自动读取文件夹中的所有mp3。这可能吗?任何帮助将不胜感激。谢谢!

编辑:实际上,我应该补充说我尝试了list.files,但是当涉及到运行system()命令时,我得到了

“系统错误(命令,as.integer(flag),f,stdout,stderr):   期望作为第一个参数的字符串“

这是我尝试过的list.files代码:

> temp = list.files(path = ".", pattern=".mp3")
> 
> file <- temp
> 
> firstSox = paste("sox ",file," -n spectrogram -o ",file,".png stats",sep='')
> sox = system(firstSox, intern = TRUE)
Error in system(command, as.integer(flag), f, stdout, stderr) : 
  character string expected as first argument
> print(sox)

我猜这不是正确的路线?因为我基本上需要将firstSox行中的'file'替换为temp数组中的每个mp3。所以不要运行:

file <- "test.mp3"

...我想让它每次为文件夹中的每个文件重新分配... ,所以它以test.mp3,然后是1.mp3运行,然后2.mp3,然后是3.mp等。

我已经在网上搜索过,感觉我已经撞到了一堵砖墙。正如评论中所述,我已经阅读了循环,但出于某种原因,我无法理解如何将其融入到我所写的内容中。我觉得我至少需要有人向我展示,或者甚至可以给我一个例子,这样我就可以绕过它了。非常感谢帮助和任何关于我做错了什么并且可以纠正的提示。感谢。

2 个答案:

答案 0 :(得分:0)

您的firstSox变量将是要运行的命令的向量(paste将生成一个向量,file的每个元素都有一个字符串)。所以现在你只需要通过system

运行每个命令

执行此操作并捕获输出的一种方法是使用lapplysapply函数:

sox <- lapply( firstSox, function(x) system(x, intern=TRUE) )

在此代码中,lapply将一次为firstSox的每个元素运行一个函数,该函数只接受当前元素(在x中)并将其传递给系统。然后lapply将所有输出收集在一起,并将它们组合成一个列入sox的列表。

如果每次运行的结果给出相同的结果形状(单个数字或相同长度的矢量),那么您可以使用sapply代替它,它将简化向量或矩阵的返回。

答案 1 :(得分:0)

尝试以下代码。我正在使用dir()而不是list.files,因为我发现它更容易。请记住,在R中有很多方法可以做同样的事情。

files <- dir(path = ".",pattern = ".mp3") #Get all the mp3 files

for(f in files) {     #Loop over the mp3 files one at a time

    firstSox = paste("sox ",f," -n spectrogram -o ",f,".png stats",sep='')
    sox = system(firstSox, intern = TRUE)
    print(sox)

}