self.urlSession.dataTask(with: request, completionHandler: { (data, response, error) in
self.endNetworkActivity()
var responseError: Error? = error
// handle http response status
if let httpResponse = response as? HTTPURLResponse {
if httpResponse.statusCode > 299 , httpResponse.statusCode != 422 {
responseError = NSError.errorForHTTPStatus(httpResponse.statusCode)
}
}
var apiResponse: Response
if let _ = responseError {
apiResponse = Response(request, response as? HTTPURLResponse, responseError!)
self.logError(apiResponse.error!, request: request)
// Handle if access token is invalid
if let nsError: NSError = responseError as NSError? , nsError.code == 401 {
DispatchQueue.main.async {
apiResponse = Response(request, response as? HTTPURLResponse, data!)
let message = apiResponse.message()
// Unautorized access
// User logout
return
}
}
else if let nsError: NSError = responseError as NSError? , nsError.code == 503 {
DispatchQueue.main.async {
apiResponse = Response(request, response as? HTTPURLResponse, data!)
let message = apiResponse.message()
// Down time
// Server is currently down due to some maintenance
return
}
}
} else {
apiResponse = Response(request, response as? HTTPURLResponse, data!)
self.logResponse(data!, forRequest: request)
}
self.removeRequestedURL(request.url!)
DispatchQueue.main.async(execute: { () -> Void in
completionHandler(apiResponse)
})
}).resume()
Я не очень знаком с зоопарком , поэтому не могу сказать, предоставляет ли он функцию или аргумент, сделает это для вас из коробки. Тем не менее, воспользовавшись аргументом ix
для na.fill
, вы можете написать простую функцию-обертку, которая обеспечивает желаемую функциональность. Возможно, что-то вроде этого:
f <- function(object, fill = 0, maxgap = Inf, ...) {
rr <- rle(is.na(object))
ii <- rep(rr$values == FALSE | rr$lengths > maxgap, rr$lengths)
na.fill(object, fill, ix = ii)
}
f(x, 0, maxgap = 3)
## 2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23
## 1 0 0 0 5 6 7
## 2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30
## 8 9 NA NA NA NA NA
## 2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05
## NA NA 17 18 19 20
В зоопарке есть недокументированное и не экспортированное .fill_short_gaps
, которое используется так:
zoo:::.fill_short_gaps(x, fill = numeric(length(x)), maxgap = 3)
, дающее:
2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23
1 0 0 0 5 6 7
2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30
8 9 NA NA NA NA NA
2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05
NA NA 17 18 19 20