2016-06-25 14 views
0

Wie kann ich den Fortschrittsbalken wie this example innerhalb einer Funktion für die Verwendung in Calc-Raster-Funktion geschrieben verwenden?Wie zeigt man den Fortschrittsbalken in der Raster-Calc-Funktion an?

Ich habe einen riesigen Datensatz zu verarbeiten und ich möchte den Fortschrittsbalken verwenden, um die Dauer des Prozesses zu steuern. Ich habe versucht, so zu verwenden, die Funktion (des Prozesses) funktioniert perfekt, aber, zeige den Fortschrittsbalken nicht.

# PROGRESS BAR IN CALC RASTER EXAMPLE 
# create data 
r <- raster(nrow=10, ncol=10) 
dataset <- list() 
for (i in 1:20) { 
    dataset[i] <- setValues(r, rnorm(ncell(r), i, 3)) 
} 
dataset <- stack(dataset) 

## function to apply 
pixel <-getValuesBlock(s1, row=1, nrows=1, col=1, ncols=1, lyrs=1:nlayers(s1)) 
CropAnalysis <- function (pixel, ...){ 
gc() 
pb <- txtProgressBar(...) 
# test : if is No data the return is 
if (identical(x = is.na(pixel), y = rep(TRUE,length(pixel)))) {NA}else{ 
averageOfhigher <- mean(pixel[pixel > 10], na.rm=T) 
averageOflower <- mean(pixel[pixel < 10], na.rm=T) 
return(c(averageOfhigher, averageOflower)) 
} 
setTxtProgressBar(pb)} 

# applying calc finction 
data_process<-calc(x=dataset, fun=CropAnalysis, forcefun=TRUE, forceapply=TRUE) 

Antwort

2

können Sie das progress Argument verwenden, die auf die meisten Funktionen im raster Paket bauen in ist. Es wird nur beim Schreiben in Chunks angezeigt (weil das Dataset groß ist).

# example data 
library(raster) 
r <- raster(nrow=10, ncol=10) 
d <- stack(lapply(1:20, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 

f <- function(pixel, ...){ 
    if (all(is.na(pixel))) { 
     c(NA, NA) # note the two NAs to match the other case 
    } else { 
     averageOfhigher <- mean(pixel[pixel > 10], na.rm=TRUE) 
     averageOflower <- mean(pixel[pixel < 10], na.rm=TRUE) 
     c(averageOfhigher, averageOflower) 
    } 
    } 

Verwenden Sie nicht die folgende Zeile in einem Skript. Es wird nur in diesem Spielzeug Beispiel benötigt in Stücke auslösen Schreiben, so dass der Fortschrittsbalken

rasterOptions(todisk=TRUE) 

Aber verwenden Sie das progress Argument (entweder „Text“ oder „Fenster“)

r <- calc(d, fun=f, progress='text') 
+0

HALLO erscheint @RobertH, ich wende deinen Vorschlag an und es gibt keinen Fortschrittsbalken, nur den Beginn und das Ende des Fortschritts. Wie behebe ich das? –

+0

das deutet darauf hin, dass es nicht viele Daten gibt. Sie können eine kleinere Chunksize in RasterOptions einstellen, um mehr Schritte zu bekommen (aber das kann die Dinge etwas verlangsamen) – RobertH

+0

wenn ich progress = "text" verwende, zeigt die Konsole nur "| | 0%" die ganze Zeit, aber wenn ich Fortschritt anwende = "window" zeigt einen windown aus dem tcltk-Paket als Fortschritt an. –