2015-05-15 18 views
5

Mój obecny cel nauki w R to unikanie pętli for. Bardzo często muszę wymieniać pliki w katalogu (lub pętlach przez katalogi), aby wykonywać różnorodne operacje na tych plikach.R - Jak uniknąć pętli na liście plików

Jednym z przykładów mojego zadania jest: Muszę wywołać aplikację systemową o nazwie cdo, aby scalić dwa pliki. Składnia tego polecenia to, powiedzmy: cdo merge input_file1 input_file2 output_file.

Mój obecny kod R wygląda następująco:

# set lists of files 
u.files <- c("uas_Amon_ACCESS1-3.nc", "uas_Amon_CMCC-CESM.nc", "uas_Amon_CMCC-CESM.nc") 
v.files <- c("vas_Amon_ACCESS1-3.nc", "vas_Amon_CMCC-CESM.nc", "vas_Amon_CMCC-CESM.nc") 

for (i in 1:length(u.files)) { 

    # set input file 1 to use on cdo 
    input1 <- paste(u.files[i], sep='') 

    # set input file 2 to use on cdo 
    input2 <- paste(v.files[i], sep='') 

    # set output file to use on cdo 
    output <- paste('output_', u.files[i], sep='') 

    # assemble the command string 
    comm <- paste('cdo merge', input1, input2, output, collapse='') 

    # submit the command 
    system(comm) 

} 

który działa ok, chociaż nie wygląda tak dobrze.

Jednak często słyszę ludzi, którzy mówią, że pętle for w R są powolne i należy ich unikać w jak największym stopniu.

Czy istnieje sposób na uniknięcie pętli for i sprawienie, by kod był bardziej wydajny/czytelny w takich przypadkach?

+1

Tutaj używasz tylko R do uruchamiania narzędzia systemowego (to znaczy cdo). Z mojego punktu widzenia bardziej efektywne może być bezpośrednie użycie skryptu powłoki. –

+0

@Pascal, ten kod jest w rzeczywistości fragmentem. W rzeczywistości mam o wiele więcej rzeczy w pętli, aż dojdzie do tego punktu. Ale wszystkie inne polecenia obejmują także indeksowanie w pętli, więc jeśli zrozumiem logikę eliminacji pętli, będę mógł użyć jej w moim prawdziwym skrypcie. – thiagoveloso

+1

Po prostu sygnalizuję, że możesz uprościć kod R przez usunięcie wszystkich niesystemowych wywołań systemowych, poprzez prepocessing. Ale oczywiście to zależy od ciebie. –

Odpowiedz

2

To więcej R-idiomatyczne:

u.files <- c("uas_Amon_ACCESS1-3.nc", "uas_Amon_CMCC-CESM.nc", "uas_Amon_CMCC-CESM.nc") 
v.files <- c("vas_Amon_ACCESS1-3.nc", "vas_Amon_CMCC-CESM.nc", "vas_Amon_CMCC-CESM.nc") 
output <- paste('output_', u.files, sep='') 
comm <- paste('cdo merge', u.files, v.files, output) 
lapply(comm,system) 

Pamiętaj, że większość funkcji są wektorowy w R, więc nie trzeba zadzwonić paste dla każdej iteracji w pętli. Na końcu uzyskujesz wektor poleceń i wykonujesz kolejno jeden po drugim, przechodząc do ostatniego wiersza lapply.

Powiązane problemy