首页 > 解决方案 > 将 lapply/for 循环与系统函数一起用于批处理终端命令

问题描述

我开始更多地在我的机器上使用终端,并希望创建一个工作流程,让我可以更好地控制更多重复性任务。我的问题是,我可以使用这个system函数,它接受一个字符串并在一个循环中通过终端运行它吗?我的挂断是在一个字符串上循环。我的想法是使用胶水包,但我想知道是否有一个基本功能或比调用外部包更好的方法?

library(glue)

setwd(path_to_files)
dir.create('pdf')

all_files <- list.files()

lapply(all_files, function(x){
  system('sytsunoconv -f [format] pdf  {x}.pptw')
})

标签: rsystemlapply

解决方案


在迭代循环中使用system应该不是问题。要创建命令向量,您可以使用基本 Rpastepaste0,尽管glue在处理更复杂的字符串时可能很有用。

创建一个命令向量就像paste("say", 1:5)返回一样简单[1] "say 1" "say 2" "say 3" "say 4" "say 5"。您可以在for循环中使用它system来按顺序运行每个:

for (command in paste("say", 1:5)) {
    system(command)
}

如果您在 Mac 上,您应该听到每个数字的 TTS 发音。

您应该能够为您的示例使用相同的模式,例如:

for (command in paste0('sytsunoconv -f [format] pdf ', list.files(), ".pptw")) {
    system(command)
}

请注意,我paste0在这里使用以避免不必要的空格。


推荐阅读