所以我对编码很新,最近写了一个涉及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等。
我已经在网上搜索过,感觉我已经撞到了一堵砖墙。正如评论中所述,我已经阅读了循环,但出于某种原因,我无法理解如何将其融入到我所写的内容中。我觉得我至少需要有人向我展示,或者甚至可以给我一个例子,这样我就可以绕过它了。非常感谢帮助和任何关于我做错了什么并且可以纠正的提示。感谢。
答案 0 :(得分:0)
您的firstSox
变量将是要运行的命令的向量(paste
将生成一个向量,file
的每个元素都有一个字符串)。所以现在你只需要通过system
执行此操作并捕获输出的一种方法是使用lapply
或sapply
函数:
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)
}