1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#
# Copyright (c) 2008-2010 Revolution Analytics
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
icountn <- function(vn) {
n <- length(vn)
if (n == 0)
stop('illegal zero length vector')
icar <- icount(vn[n])
if (n > 1) {
icdr <- icountn(vn[-n])
hasVal <- FALSE
nextVal <- NULL
}
nextEl <- if (n == 1) {
function() nextElem(icar)
} else {
function() {
repeat {
if (!hasVal) {
nextVal <<- nextElem(icar)
hasVal <<- TRUE
}
tryCatch({
return(c(nextElem(icdr), nextVal))
},
error=function(e) {
if (identical(conditionMessage(e), 'StopIteration')) {
icdr <<- icountn(vn[-n])
hasVal <<- FALSE
} else {
stop(e)
}
})
}
}
}
structure(list(nextElem=nextEl), class=c('abstractiter', 'iter'))
}
iwhich <- function(nf, ind) {
n <- length(ind)
if (n == 0)
stop('illegal zero length vector')
x <- rep(TRUE, length(nf[[1]]))
for (i in seq_len(n))
x <- x & nf[[i]] == ind[i]
which(x)
}
# define the generic function
isplit <- function(x, f, drop=FALSE, ...) {
UseMethod('isplit')
}
# define the default method
isplit.default <- function(x, f, drop=FALSE, ...) {
if (!is.list(f)) f <- list(f)
cf <- lapply(f, function(a) if (is.factor(a)) a else as.factor(a))
nf <- lapply(cf, as.integer)
flevels <- lapply(f, function(a) if (is.factor(a)) levels(a) else sort(unique.default(a)))
it <- icountn(unlist(lapply(cf, nlevels)))
nextEl <- function() {
repeat {
i <- nextElem(it)
j <- iwhich(nf, i)
if (!drop || length(j) > 0)
break
}
k <- seq_along(i)
names(k) <- names(cf)
key <- lapply(k, function(x) flevels[[x]][i[x]])
list(value=x[j], key=key)
}
structure(list(nextElem=nextEl), class=c('abstractiter', 'iter'))
}
# define the data frame method which uses the default method
isplit.data.frame <- function(x, f, drop=FALSE, ...) {
it <- isplit(seq_len(nrow(x)), f, drop=drop, ...)
nextEl <- function() {
i <- nextElem(it)
list(value=x[i$value,, drop=FALSE], key=i$key)
}
structure(list(nextElem=nextEl), class=c('abstractiter', 'iter'))
}
|