2015-05-15 4 views
5

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?

+1

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

+0

@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

+1

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

Antwort

2

Das ist mehr R-idiomatische:

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) 

Denken Sie daran, dass die meisten Funktionen in R vektorisiert werden, so dass Sie sich nicht paste für jede Iteration in der Schleife nennen. Am Ende erhalten Sie einen Vektor von Befehlen und führen nacheinander in der letzten Zeile lapply aus.

Verwandte Themen