Цикъл върху множество файлове с помощта на алгоритъм с множество входове с трицифрени числа в R

Използвам софтуер за генетична интерпретация, наречен SAIGE-GENE. Алгоритъмът изглежда така (пълният алгоритъм на https://github.com/weizhouUMICH/SAIGE/wiki/Genetic-association-tests-using-SAIGE#step-2--performing-the-region--or-gene-based-association-tests): Това включва множество различни файлове, които се въвеждат с номера на хромозоми в имената им (от 1 до 22).

SPAGMMATtest = function(
         vcfFile = "",
                 vcfFileIndex = "",
         vcfField = "DS",
         groupFile ="",
         savFile = "",
         savFileIndex = "",
         sampleFile = "", 
         idstoExcludeFile = "",
         idstoIncludeFile = "",
         rangestoExcludeFile = "",
         rangestoIncludeFile = "",
         chrom = "",
         start = 1,
         end = 250000000,
         IsDropMissingDosages = FALSE,  
         minMAC = 0.5, 
                 minMAF = 0,
         maxMAFforGroupTest = 0.5,
             minInfo = 0,
                 GMMATmodelFile = "", 
                 varianceRatioFile = "", 
                 SPAcutoff=2, 
                 SAIGEOutputFile = "",
         numLinesOutput = 10000, 
         IsSparse=TRUE,

......

Не съм сложил всичко тук, тъй като не е уместно. Въвеждам няколко различни файла в този алгоритъм и обикновено именувам моите файлове chr1_file_name.txt...chr22_file_name.txt.

След това използвам for цикъл в R върху целия алгоритъм, като използвам функцията за поставяне, за да въведа различните имена на файлове по номер на хромозома:

for(i in 1:22){SPAGMMATtest = function(
         vcfFile = paste("chr",i,"_file_name.txt", sep=""),
                 vcfFileIndex = "",
         vcfField = "DS",
         savFile = "",
         groupFile ="paste("chr",i,".group_file.txt", sep="")",

и т.н

Това обаче работи добре, реших, че ще бъда умен и ще използвам трицифрено именуване за моите имена на файлове за този експеримент: chr001_file_name.txt...chr022_file_name.txt.

Предишният ми цикъл сега не работи и ако променя началото на цикъла на for(i в 001:022), той също не работи.

Какво правя погрешно и как мога да поправя това, без да преименувам всичките си файлове?


person tacrolimus    schedule 17.08.2020    source източник
comment
опитайте: vcfFile = paste("chr",sprintf( "%03d", i),"_file_name.txt", sep=""), редактиране: за по-кратък код можете да използвате paste0() и да изпуснете sep-аргумента...   -  person Wimpel    schedule 17.08.2020
comment
благодаря Wimpel, мисля, че работи (необходими са векове, за да се изпълнява!). Придържате ли се към (i в 1:22) в цикъла тогава? %03d означава ли една нула и след това i до общо 3 цифри?   -  person tacrolimus    schedule 17.08.2020
comment
%03d означава: конвертирайте в три цифри, добавете водещи нули, когато е необходимо.. така че 1 става 001, 21 става 021 и 201 остава 201.   -  person Wimpel    schedule 17.08.2020


Отговори (1)


Wimpel предложи на

опитайте: vcfFile = paste("chr",sprintf( "%03d", i),"_file_name.txt", sep=""), редактирайте: за по-кратък код можете да използвате paste0() и да изпуснете sep-аргумента.

за да създадете имена на файлове със знаци, които включват 3 цифри и водещи нули, напр. 001, 002, ..., 022.

Това може да бъде допълнително съкратено чрез създаване на името на файла изцяло с sprintf(), като по този начин се премахнат извикванията към paste() или paste0():

sprintf("chr%03d_file_name.txt", i)

С i <- 1, например sprintf("chr%03d_file_name.txt", i) връща "chr001_file_name.txt".


Има и второ наблюдение:

OP е публикувал кодовия фрагмент

for(i in 1:22){SPAGMMATtest = function(
         vcfFile = paste("chr",i,"_file_name.txt", sep=""),
                 vcfFileIndex = "",
         vcfField = "DS",
         savFile = "",
         groupFile ="paste("chr",i,".group_file.txt", sep="")",
         ...

Това изглежда така, сякаш OP е изтеглил дефиницията на функцията в цикъла for. Вярвам, че е достатъчно само да извикате функцията от цикъла for:

for (i in 1:22) {
     SPAGMMATtest(
         vcfFile = sprintf("chr%03d_file_name.txt", i),
         vcfFileIndex = "",
         vcfField = "DS",
         savFile = "",
         groupFile = sprintf("chr%03d.group_file.txt", i)
         ...
person Uwe    schedule 20.08.2020
comment
Уважаеми @Uwe, много благодаря, че отделихте време да усъвършенствате кода и полезното обяснение. Благодарение и на вашите усилия научих много за полезността на sprintf и по-ефективното извикване на цикли. - person tacrolimus; 20.08.2020