Mein aktuelles Lernziel in R ist for
Schleifen zu vermeiden. Ich muss sehr oft die Dateien in einem Verzeichnis auflisten (oder durchläuft Verzeichnisse), um verschiedene Operationen für diese Dateien auszuführen.R - Wie Schleife in der Liste der Dateien zu vermeiden
Ein Beispiel für meine Aufgabe ist das Folgende: Ich muss eine Systemanwendung namens cdo
aufrufen, um zwei Dateien zusammenzuführen. Die Syntax dieses Befehls lautet: cdo merge input_file1 input_file2 output_file
.
Mein aktueller R-Code sieht wie folgt aus:
# 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)
}
, die ok funktioniert, obwohl nicht so gut aussieht.
Allerdings höre ich oft Leute sagen, dass for
Schleifen in R sind langsam und sollte so viel wie möglich vermieden werden.
Gibt es eine Möglichkeit, die for-Schleifen zu vermeiden und den Code in solchen Fällen effizienter/lesbarer zu machen?
Hier verwenden Sie nur R, um ein Systemtool (d. H. Cdo) auszuführen. Aus meiner Sicht könnte es effizienter sein, ein Shell-Skript direkt zu verwenden. –
@Pascal, dieser Code ist eigentlich ein Auszug. In Wirklichkeit habe ich viel mehr Dinge in der Schleife, bis es zu diesem Punkt kommt. Aber alle anderen Befehle beinhalten auch die Indizierung in der Schleife. Wenn ich also die Logik hinter der Eliminierung der Schleife verstehe, könnte ich sie in meinem eigentlichen Skript verwenden. – thiagoveloso
Ich signalisiere nur, dass Sie Ihren R-Code vereinfachen können, indem Sie alle unnötigen Systemaufrufe durch Vorverarbeitung entfernen. Aber natürlich liegt es an dir. –