summaryrefslogtreecommitdiff
path: root/R/util.R
diff options
context:
space:
mode:
Diffstat (limited to 'R/util.R')
-rw-r--r--R/util.R53
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