2016-04-15 7 views
1

Ich versuche, eine GUI mit gWidgets R-Bibliothek zum Herunterladen von Satellitenbildern zu erstellen. Die Absicht ist, die URLs aus einer kommagetrennten Wertedatei zu lesen. Die GUI sieht gut aus, aber sie tut nicht, was ich von ihr erwarte. Ich mache etwas falsch, jede Hilfe wird sehr geschätzt. HierLesen Sie CSV mit gfilebrowse von gWidgets

sind die Beispieldaten:

Online.Access.URLs <- c("http://e4ftl01.cr.usgs.gov//MODIS_Composites/MOLT/MOD09A1.005/2000.02.18/MOD09A1.A2000049.h09v06.005.2006268183648.hdf", 
          "http://e4ftl01.cr.usgs.gov//MODIS_Composites/MOLT/MOD09A1.005/2000.02.26/MOD09A1.A2000057.h09v06.005.2006270065224.hdf", 
          "http://e4ftl01.cr.usgs.gov//MODIS_Composites/MOLT/MOD09A1.005/2000.03.05/MOD09A1.A2000065.h09v06.005.2006269234536.hdf") 



Producer.Granule.ID <- c("MOD09A1.A2000049.h09v06.005.2006268183648.hdf", 
           "MOD09A1.A2000057.h09v06.005.2006270065224.hdf", 
           "MOD09A1.A2000065.h09v06.005.2006269234536.hdf") 

df <- data.frame(Producer.Granule.ID,Online.Access.URLs)

write.csv(df,"C:\\GUI_test\\h09v06v3.csv",row.names=FALSE) 

Und das ist mein Versuch:

my.DownloadHDF <- function(){ 

    library(gWidgets) 
    library(gWidgetstcltk) 
    library(RCurl) 

    options(guiToolkit = "tcltk") 
    win <- gwindow("Download HDF with R!", visible = FALSE) 

    csv.frame  <- gframe("csv file ", container = win) 
    csv.label  <- glabel("csv with HDF's names ", container = csv.frame) 
    csv.file.name <- gfilebrowse("Select csv file", type="open",cont=csv.frame,action="read.csv") 

    dir.frame <- gframe("Output Directory ", container = win) 
    dir.label <- glabel("Where to save HDF's? ", container = dir.frame) 
    dir.out <- gfilebrowse("Select folder ",type = "selectdir", cont=dir.frame) 

    dlw.frame <- gframe("Download ", container = win) 
    dlw.label <- glabel(" ", container = dlw.frame) 

    btnDwn <- gbutton("Start Download", container = dlw.frame, 
        handler = function(csv.file.name,dir.out){ 

         df  <- read.csv(csv.file.name, header=TRUE,sep=",") 
         hdf.urls <- df$Online.Access.URLs      
         hdf.urls <- as.character(hdf.urls) 
         hdf.names <- df$Producer.Granule.ID     
         hdf.names <- as.character(hdf.names) 

         for (i in 1:length(hdf.names)){ 
         URL  <- hdf.urls [i]  
         file  <- hdf.names[i]  
         download.file(URL,paste(dir.out,file,sep=""),mode="wb") 
         cat(paste("Composite number ",i,"successfully downloaded!"),sep="\n") 
         cat("\n\n\n\n\n\n\n\n") 
         }}) 
    visible(win) <- TRUE 
} 
my.DownloadHDF() 

Ich bin mit R-3.2.2 mit RStudio 0,98. 1103.

+0

Haben Sie über glänzende Verwendung gedacht? Es sieht einfacher aus als gWidgets. – YCR

+0

Hallo YCR, danke für deine Antwort. Ich habe keine Erfahrung damit, GUI mit R zu erstellen. Ich habe mich kurz mit shiny und gWdigets befasst, und ich fand letzteres intuitiver. Die GUI, die ich erstellt habe, macht die Arbeit bis zu einem bestimmten Punkt, das Problem ist, dass ich nicht weiß, wie man die Funktion liest die CSV-Datei. Irgendeine Idee? – Shepherd

+0

Es gab Probleme mit gWidgets2tcltk und Shiny. Vielleicht gibt es jetzt behoben. Wenn es funktioniert, dann ist 'read.csv' dein Freund. Es kann in einem Handler aufgerufen werden: 'a = gfilebrowse (cont = w, handler = Funktion (h, ...) x << - read.csv (svalue (h $ obj)))' Dies wird x zugeordnet Werte eingelesen. Es sollte dort eine Validierung sein, aber Sie können das hinzufügen. Sie können aber auch "gcombobox" verwenden, wenn Sie eine vorbelegte URL-Liste auswählen. – jverzani

Antwort

1

Hier ist das Skript nach den Verbesserungen. Jetzt macht es genau das, was ich von ihm erwarte. Ich hoffe, jemand findet es nützlich:

# load functions #### 
# download function 
f.d <- function(hdf.urls,hdf.names,out.dir){ 
    for(i in 1:length(hdf.urls)){ 
    URL  <- hdf.urls [i]  
    file  <- hdf.names [i] 
    download.file(URL,paste(out.dir,"/",file,sep=""),mode="wb") 
    }} 

# read csv function 
f.csv <- function(x){ 
    df1 <<- read.csv(x,header=TRUE,sep=",") 
    hdf.urls <<- df1$Online.Access.URLs 
    hdf.urls <<- as.character(hdf.urls) 
    hdf.names <<- df1$Producer.Granule.ID 
    hdf.names <<- as.character(hdf.names) 
} 
# load functions #### 

# my.DownloadHDFv2 this one works fine #### 
my.DownloadHDF <- function(){ 
    options(guiToolkit = "tcltk") 

    win   <- gwindow("Download HDF with R!", visible = FALSE) 
    csv.frame <- gframe("csv with HDFs names ", container = win) 

    a <- gfilebrowse("Upload csv file",cont=csv.frame, 
        handler=function(h,...){ 
        f.csv(svalue(a))     
    }) 

    path.frame <- gframe("Output Directory ", container = win) 
    brow   <- gfilebrowse(text = "Select folder...", type = "selectdir",container=path.frame, 
           handler=function(h,...){ 
           out.dir  <<- svalue(brow) 
           }) 

    b <- gbutton(text="Start Download",container = win, 
         handler = function(h,...){ 
          f.d(hdf.urls,hdf.names,out.dir=out.dir)     
         }) 
    visible(win)<-TRUE 
} 
my.DownloadHDF() 
# my.DownloadHDFv2 this one works fine ####