Прежде всего, извините, если этот вопрос уже был адресован где-то еще, но я не смог найти ответ.
В R
У меня есть for loop
, который сохраняет текст (writeLines
) в файл в соответствии с определенным условием. Каждый 10-й записанный файл я хотел бы сохранить в новую подпапку. Таким образом, каждая подпапка будет иметь максимум 10 файлов.
Теперь я могу написать скрипт, который делает это, если все файлы должны быть записаны (см. Ниже), но я не уверен, как это сделать. Реализуйте изменение подпапки каждый раз, когда папка заполнена 10 файлами.
Следует пояснить приведенный ниже пример.
# generate random num
set.seed(15)
input <- rnorm(100, mean = 10, sd = 3)
# Write to file only if num is greater than threshold
thrshld <- 10
out_dir <- "~/R/tmp/Batch_Saving"
k <- 1
i <- 1
for (i in 1:length(input)) {
if ( any(i == seq(from = 1, to = length(input), by = 10) ) ) {
# Create a new subfolder everytime i is a multiple of 10
sub_dir <- paste0(out_dir, "/Dir_Num_", k)
k <- k+1
}
if ( input[i] > thrshld) {
txt <- paste("The number", signif(input[i], 4), "is greater than", thrshld)
# Create folder if it doesn't exist
if (!dir.exists(sub_dir)) { dir.create(sub_dir, recursive = T) }
# Write text to file
writeLines(text = txt,
con = paste0(sub_dir, "/file_", i, ".txt") )
}
}
Этот сценарий создает 10 папок, каждая из которых содержит менее 10 файлов, но не одинаковое количество файлов. Это можно быстро проверить в терминале следующим образом:
Batch_Saving > find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;
./Dir_Num_4 : 6 file(s)
./Dir_Num_3 : 7 file(s)
./Dir_Num_2 : 4 file(s)
./Dir_Num_5 : 7 file(s)
./Dir_Num_10 : 4 file(s)
./Dir_Num_9 : 5 file(s)
./Dir_Num_7 : 3 file(s)
./Dir_Num_6 : 6 file(s)
./Dir_Num_1 : 6 file(s)
./Dir_Num_8 : 4 file(s)
Я считаю, что единственный способ добиться этого - либо читать каждый раз, сколько файлов уже записано, либо как-то отслеживать, сколько файлов уже были написаны и измените соответственно параметр k
.
Я полагаю, что это также может быть достигнуто с помощью других методов (например, apply
), но ради обучения я хотел бы закодировать это в al oop.
Большое спасибо!