跟踪循环中的错误

时间:2016-06-02 17:34:28

标签: r loops dplyr

我正在尝试为以下数据创建一个循环:

  1. 获取特定Date
  2. 的所有数据
  3. 使用插值函数dpinterp计算Date
  4. 内的插值
  5. 绘制每个日期的数据并将其作为文件输出。我对此步骤感到满意,因此不会在此处包含它。我提到它只是为了说明为什么我在这种情况下使用循环。
  6. 包和功能:

    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)
    }
    

    数据创建:

    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"))
    

    不幸的是我无法用上面的数据集重现我的错误,但是对于这个例子,我认为这不重要。我想知道的是,如果我尝试运行下面的循环并收到错误,我该如何跟踪发生了哪个Date错误?

    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)
    

    我意识到这样的事情是等价的:

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

    但是,我不知道如何追踪dplyr管道中的错误。

    所以基本的问题是,对于上下文的所有上述内容,我如何追踪循环中的错误以确定Date并给我带来问题?

    修改

    以下是我收到的错误:

      

    interp.old中的错误(x,y,z,xo = xo,yo = yo,ncp = 0,extrap =   extrap,:所有数据共线调用:interp.old(x,y,z,xo =   xo,yo = yo,ncp = 0,extrap = extrap,       duplicate = duplicate,dupfun = dupfun)浏览[1]&gt;

    没关系,有些数据似乎是共线的。但我的问题是哪些数据丢失了错误?以下是追溯的结果:

    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
    

1 个答案:

答案 0 :(得分:1)

解决循环中出现的问题的一种经过验证的方法是在score > 80循环的每次迭代期间打印出递增器。

您可以尝试类似

的内容
{ "grades" : { $elemMatch: { score: { $gt:80, $lt:100 } } } } 

通过添加多个具有略微不同消息的打印语句,您可以看到问题发生在循环体中的哪个位置。