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?
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. –
@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
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. –