2016-06-02 4 views
1

I eine Schleife für einige Daten zu schaffen versuche, dass:einen Fehler in einer Schleife der Spur

  1. alle Daten für eine bestimmte Funktion Date
  2. verwendet eine Interpolation nimmt dpinterp Interpolation zu berechnen innerhalb dieser Date
  3. Die Daten für jedes Datum grafisch darstellen und als Datei ausgeben. Ich bin mit diesem Schritt einverstanden und werde ihn daher hier nicht berücksichtigen. Ich erwähne es nur um zu veranschaulichen, warum ich in diesem Fall eine Schleife verwende.

Pakete und Funktion:

library(akima) 
library(dplyr) 


dpinterp <- function(df=df) { 
    interp_df <- interp(x=df$x, y=df$y, z=df$x, duplicate="mean") 
    interp2xyz(interp_df, data.frame=TRUE) 
} 

Datenerstellung:

df <- data.frame(
    x=runif(4000,1,400), 
    y=runif(4000,10,40), 
    z=runif(4000,10,40), 
    Date=seq(as.Date("1910/1/1"), as.Date("1910/1/4"), "days")) 

Leider bin ich nicht in der Lage meine Fehler mit den oben genannten Datensatzes zu reproduzieren, aber für dieses Beispiel glaube ich nicht es ist wichtig. Was ich gerne wissen würde ist, wenn ich versuche, die Schleife unten zu laufen und ich einen Fehler erhalte, wie kann ich verfolgen, welcher Date dieser Fehler auftrat?

day <- unique(df$Date) 

diagdf <- c() 
for (i in day) 
{ 
    u <- df %>% 
    filter(Date %in% i) %>% 
    do(dpinterp(.)) %>% 
    ungroup() 

    diagdf <- rbind(diagdf, u) 
    diagdf$Date <- as.Date(i, origin="1970-01-01") 
} 
tbl_df(diagdf) 

Ich weiß, dass so etwas wie dies entspricht:

df %>% 
    group_by(Date) %>% 
    do(dpinterp(.)) 

Aber ich weiß nicht, wie Fehler in einem dplyr Rohr Zurückverfolgungs.

Also die grundlegenden Fragen ist, mit all dem oben für den Kontext, ist, wie traceback Fehler innerhalb einer Schleife, um herauszufinden, was Date und mir Probleme?

bearbeiten

Hier ist der Fehler I erhalten:

Fehler in interp.old (x, y, z, xo = xo, yo = yo, ncp = 0, = extrap extrap,: alle Daten kollinear Abgerufen von: interp.old (x, y, z, xo = xo, yo = yo, ncp = 0, extrap = extrap, duplicate = duplicate, dupfun = dupfun) Durchsuchen [1] >

Das ist in Ordnung, einige der Daten scheinen kollinear zu sein. Aber mein Problem ist, welche Daten den Fehler werfen? Hier sind die Ergebnisse einer Traceback:

traceback() 

18: stop("all data collinear") 
17: interp.old(x, y, z, xo = xo, yo = yo, ncp = 0, extrap = extrap, 
     duplicate = duplicate, dupfun = dupfun) 
16: interp(x = df$Pos, y = df$depth, z = df$value, duplicate = "mean") at #2 
15: dpinterp(.) 
14: eval(expr, envir, enclos) 
13: eval(x$expr, data, x$env) 
12: lazyeval::lazy_eval(args[[1]], data) 
11: do_.data.frame(.data, .dots = lazyeval::lazy_dots(...)) 
10: do_(.data, .dots = lazyeval::lazy_dots(...)) 
9: do(., dpinterp(.)) 
8: function_list[[k]](value) 
7: withVisible(function_list[[k]](value)) 
6: freduce(value, `_function_list`) 
5: `_fseq`(`_lhs`) 
4: eval(expr, envir, enclos) 
3: eval(quote(`_fseq`(`_lhs`)), env, env) 
2: withVisible(eval(quote(`_fseq`(`_lhs`)), env, env)) 
1: ktlpltdf %>% filter(variable %in% c(j)) %>% filter(Date == as.Date(i, 
     origin = "1970-01-01")) %>% mutate(Pos = ifelse(Station == 
     "KLF1", 1, ifelse(Station == "KLF7", 3, 2))) %>% do(dpinterp(.)) at #5 
+0

Was ist der Fehler? Sie können auch über dieses Problem nachdenken, indem Sie eine anwendungsspezifische Familienfunktion verwenden. Im Allgemeinen wollen Sie 'for' Schleifen und' rbind' die Ergebnisse nicht verwenden. – Vedda

+0

Ich würde ein oder zwei 'print (i," Nummer 1 ")' und 'print (i," Nummer 2 ")' type-Anweisungen einwerfen. – lmo

+0

@lmo Können Sie ein wenig ausarbeiten? – boshek

Antwort

1

Eine bewährte Methode zur Lösung von Problemen, die in einer Schleife auftreten, ist es, den Inkrementierer während jeder Iteration in der Schleife for auszudrucken.

Sie so etwas wie

versuchen könnte
for(i in day) { 
    # first print out 
    cat(i, "number 1") 

    ... dplyr stuff ungroup() 

    # print a successful run through the `dplyr` chain 
    cat(i, "number 2") 

    ... other stuff 
} 

Durch mehrere Druckanweisungen hinzufügen, die eine etwas andere Botschaft haben, können Sie, wo im Körper der Schleife sehen das Problem auftritt.

Verwandte Themen