2014-11-13 7 views
11

ich einige Beispiel-Code haben, die eine for-Schleife enthält und schafft einige Grundstücke wie diese (meine aktuellen Daten erstellt mehrere tausend Plots):R: Text Fortschrittsbalken in for-Schleife

xy <- structure(list(NAME = structure(c(2L, 3L, 1L, 1L), .Label = c("CISCO","JOHN", "STEPH"), class = "factor"), ID = c(41L, 49L, 87L, 87L), X_START_YEAR = c(1965L, 1948L, 1959L, 2003L), Y_START_VALUE = c(940L,-1760L, 110L, 866L), X_END_YEAR = c(2005L, 2000L, 2000L, 2007L), Y_END_VALUE = c(940L, -1760L, 110L, 866L), LC = structure(c(1L,1L, 2L, 2L), .Label = c("CA", "US"), class = "factor")), .Names = c("NAME", "ID", "X_START_YEAR", "Y_START_VALUE", "X_END_YEAR", "Y_END_VALUE","LC"), class = "data.frame", row.names = c(NA, -4L)) 

ind <- split(xy,xy$ID) # split by ID for different plots 

# Plots 
for (i in ind){ 
    xx = unlist(i[,grep('X_',colnames(i))]) 
    yy = unlist(i[,grep('Y_',colnames(i))])  
    fname <- paste0(i[1, 'ID'],'.png') 
    png(fname, width=1679, height=1165, res=150) 
    par(mar=c(6,8,6,5)) 
    plot(xx,yy,type='n',main=unique(i[,1]), xlab="Time [Years]", ylab="Value [mm]") 
    i <- i[,-1] 
    segments(i[,2],i[,3],i[,4],i[,5],lwd=2) 
    points(xx, yy, pch=21, bg='white', cex=0.8) 
    dev.off() 
} 

Um zu sehen, den Fortschritt die for-Schleife würde mich interessieren, eine Fortschrittsbalken zu meinem Code zu integrieren. Wie ich aus der R-Dokumentation erfahren habe, gibt es die txtProgressBarhttp://stat.ethz.ch/R-manual/R-patched/library/utils/html/txtProgressBar.html Aus dem Beispiel dieser Seite verstehe ich, dass Sie die for-Schleife in eine Funktion schreiben müssen, um sie danach aufzurufen, die ich mit meinem Beispiel zu kämpfen habe.

Wie könnte ich einen Fortschrittsbalken in die for-Schleife implementieren?

Antwort

12

Damit die Fortschrittsleiste funktioniert, benötigen Sie eine Nummer, um Ihren Fortschritt zu verfolgen. das ist einer der Gründe als eine allgemeine Regel bevorzuge ich für mit (i in 1:length(ind)) statt direkt das Objekt, das ich will, dort zu setzen. Alternativ erstellen Sie einfach eine weitere stepi Variable, die Sie in jeder Iteration stepi = stepi + 1 machen.

müssen Sie zuerst die progressbar Objekt außerhalb der Schleife

pb = txtProgressBar(min = 0, max = length(ind), initial = 0) 

dann in dir mit jeder Iteration

setTxtProgressBar(pb,stepi) 

oder

setTxtProgressBar(pb,i) 

Dies funktioniert schlecht aktualisieren müssen erstellen wenn die Schleife auch print Befehle enthält

+0

auch die Optionen von txtProgressBar überprüfen. Es sieht viel besser aus, wenn Sie sie verwenden – OganM

+0

ja, ich tat das, danke. Das einzige, was nicht funktioniert, sind die Titel- und Label-Optionen? Kennst du zufällig einen Weg, weil es cool wäre, einen Titel zu haben? – kurdtc

+1

Ich fand eine Abhilfe mit der 'cat()' Funktion. – kurdtc

5

Sie könnten ein sehr einfaches on the fly schreiben Prozent zeigen beendet:

n <- 100 
for (ii in 1:n) { 
    cat(paste0(round(ii/n * 100), '% completed')) 
    Sys.sleep(.05) 
    if (ii == n) cat(': Done') 
    else cat('\014') 
} 
# 50% completed 

Oder man die Textleiste zu replizieren:

n <- 100 
for (ii in 1:n) { 
    width <- options()$width 
    cat(paste0(rep('=', ii/n * width), collapse = '')) 
    Sys.sleep(.05) 
    if (ii == n) cat('\014Done') 
    else cat('\014') 
} 
# ============================