diff options
Diffstat (limited to 'R/util.R')
-rw-r--r-- | R/util.R | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/R/util.R b/R/util.R new file mode 100644 index 0000000..4667f9a --- /dev/null +++ b/R/util.R @@ -0,0 +1,53 @@ +#' Multiple assignment operator +#' +#' Assign multiple variables from a list or function return object +#' +#' @param l the variables to be assigned +#' @param r the list or function-return object +#' +#' @aliases g +#' +#' @export +'%=%' = function(l,r) UseMethod('%=%') + +# Binary Operator +#' @export +'%=%.lbunch' = function(l,r) { + Envir = as.environment(-1) + +# if (length(r) > length(l)) +# warning("RHS has more args than LHS. Only first", length(l), "used.") + + if (length(l) > length(r)) { + warning("LHS has more args than RHS. RHS will be repeated.") + r <- extendToMatch(r, l) + } + + for (II in 1:length(l)) { + do.call('<-', list(l[[II]], r[[II]]), envir=Envir) + } +} + +# Used if LHS is larger than RHS +extendToMatch <- function(source, destin) { + s <- length(source) + d <- length(destin) + + # Assume that destin is a length when it is a single number and source is not + if(d==1 && s>1 && !is.null(as.numeric(destin))) + d <- destin + + dif <- d - s + if (dif > 0) { + source <- rep(source, ceiling(d/s))[1:d] + } + return (source) +} + +# Grouping the left hand side +#' @export +g = function(...) { + List = as.list(substitute(list(...)))[-1L] + class(List) = 'lbunch' + return(List) +}
\ No newline at end of file |