2016-06-23 2 views
0

Я запрашиваю данные из GA, где дата начала каждой итерации содержится в списке (begDate). Я исследовал, как остановить потерю запрашиваемых данных с помощью tryCatch, если возникла ошибка до того, как цикл завершится через список. Обычно ошибки возникают из-за тайм-аутов. Я хотел бы иметь возможность повторить элемент перед тем, как перейти к следующему элементу. Для этого я поместил в обработчик ошибок тот же код, что и в основной части tryCatch. Однако это плохо, когда запрос в обработчике ошибок также истекает. Как мне написать это правильно? Большинство сообщений, которые я нашел, рассматривают эту проблему в цикле или переходят к следующему элементу. Я тоже смотрел с Restarts, но не понимал, как его использовать.Повторить элемент списка с tryCatch в lapply

begDate<-array(c(seq(as.Date("2014-04-01"), as.Date("2014-04-03"), by="1 day"))) #defining start date for each query 

Test<-lapply(begDate, function(bDt){ #uses each element of begDate as the beginning time period of query with 90 day length 
    rg2<-paste0("users::condition::ga:sessionCount==1;dateOfSession<>", as.Date(bDt, origin = "1970-01-01"), "_", as.Date(bDt, origin = "1970-01-01"), ";users::condition::ga:goalCompletionsAll>0") 



    tryCatch(ga$getData(id, 
         walk = TRUE, 
         batch = TRUE, 
         start.date = as.Date(bDt+1, origin = "1970-01-01"), 
         end.date = as.Date(bDt+15, origin = "1970-01-01"), 
         metrics = "ga:sessions, ga:goalCompletionsAll" , 
         dimensions = "ga:date, ga:goalPreviousStep1, ga:goalPreviousStep2, ga:goalPreviousStep3", 
         segment = paste0(rg2), 
         filters = "" 
        ) 
    , error=function(e) { # just retries the query 
      ga$getData(id, 
         walk = TRUE, 
         batch = TRUE, 
         start.date = as.Date(bDt+1, origin = "1970-01-01"), 
         end.date = as.Date(bDt+15, origin = "1970-01-01"), 
         metrics = "ga:sessions, ga:goalCompletionsAll" , 
         dimensions = "ga:date, ga:goalPreviousStep1, ga:goalPreviousStep2, ga:goalPreviousStep3", 
         segment = paste0(rg2), 
         filters = "" 
      )  
         } 

    ) 

}) 

ответ

0

Это решение, которое я нашел, чтобы быть наиболее стабильным в отсутствие зная, как лучше писать код (который я постоянно пытаюсь улучшить).

Test<-lapply(begDate, function(bDt){ #uses each element of begDate as the beginning time period of query with 50 day length 
    rg2<-paste0("users::condition::ga:source=~", urlV, ";dateOfSession<>", as.Date(bDt, origin = "1970-01-01"), "_", as.Date(bDt, origin = "1970-01-01")) 

tryCatch (га $ GetData (идентификатор, ходьбы = TRUE, партия = TRUE, start.date = as.Date (БРЭ + 1, начало = "1970-01-01"), end.date = as.Date (bDt + 50, origin = "1970-01-01"), metrics = paste0 (metr), dimensions = paste0 (dim), segment = seg, filters = "ga: country = ~ United States " )

, error = function (e) { Sys.sleep (7) tryCatch (ga $ getData (id, walk = TRUE, batch = TRUE, start.date = as.Date (bDt + 1, origin = "1970-01-01"), end.date = as. Дата (bDt + 50, origin = "1970-01-01"), metrics = paste0 (metr), dimensions = paste0 (dim), segment = seg, filters = "ga: country = ~ United States" ) , ошибка = функция (е) печати (paste0 (BDT "", е))) })

})