Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assign multiple new variables on LHS in a single line

I want to assign multiple variables in a single line in R. Is it possible to do something like this?

values # initialize some vector of values (a, b) = values[c(2,4)] # assign a and b to values at 2 and 4 indices of 'values' 

Typically I want to assign about 5-6 variables in a single line, instead of having multiple lines. Is there an alternative?

like image 300
user236215 Avatar asked Sep 22 '11 18:09

user236215


People also ask

How do I assign multiple variables to one line?

When assigning multiple variables in a single line, different variable names are provided to the left of the assignment operator separated by a comma. The same goes for their respective values except they should to the right of the assignment operator.

How do I assign multiple values to a single variable in R?

For instance, create a 1 row dataframe (say V ) and initialize your variables in it. Now you can assign to multiple variables at once V[,c("a", "b")] <- values[c(2, 4)] , call each one by name ( V$a ), or use many of them at the same time ( values[c(5, 6)] <- V[,c("a", "b")] ).

How do you assign two variables in one line in Java?

int a, b, c; You can also assign multiple variables to one value: a = b = c = 5; This code will set c to 5 and then set b to the value of c and finally a to the value of b .

How do I assign multiple variables in Matlab?

Use comma-separated lists to get multiple variables in the left hand side of an expression. You can use deal() to put multiple assignments one line. [x,y] = deal(cell(4,8), cell(4,8)); Call it with a single input and all the outputs get the same value.


2 Answers

There is a great answer on the Struggling Through Problems Blog

This is taken from there, with very minor modifications.

USING THE FOLLOWING THREE FUNCTIONS (Plus one for allowing for lists of different sizes)

# Generic form '%=%' = function(l, r, ...) UseMethod('%=%')  # Binary Operator '%=%.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 g = function(...) {   List = as.list(substitute(list(...)))[-1L]   class(List) = 'lbunch'   return(List) } 


Then to execute:

Group the left hand side using the new function g() The right hand side should be a vector or a list Use the newly-created binary operator %=%

# Example Call;  Note the use of g()  AND  `%=%` #     Right-hand side can be a list or vector g(a, b, c)  %=%  list("hello", 123, list("apples, oranges"))  g(d, e, f) %=%  101:103  # Results:  > a [1] "hello" > b [1] 123 > c [[1]] [1] "apples, oranges"  > d [1] 101 > e [1] 102 > f [1] 103 


Example using lists of different sizes:

Longer Left Hand Side

g(x, y, z) %=% list("first", "second") #   Warning message: #   In `%=%.lbunch`(g(x, y, z), list("first", "second")) : #     LHS has more args than RHS. RHS will be repeated. > x [1] "first" > y [1] "second" > z [1] "first" 

Longer Right Hand Side

g(j, k) %=% list("first", "second", "third") #   Warning message: #   In `%=%.lbunch`(g(j, k), list("first", "second", "third")) : #     RHS has more args than LHS. Only first2used. > j [1] "first" > k [1] "second" 
like image 57
Ricardo Saporta Avatar answered Sep 28 '22 21:09

Ricardo Saporta


Consider using functionality included in base R.

For instance, create a 1 row dataframe (say V) and initialize your variables in it. Now you can assign to multiple variables at once V[,c("a", "b")] <- values[c(2, 4)], call each one by name (V$a), or use many of them at the same time (values[c(5, 6)] <- V[,c("a", "b")]).

If you get lazy and don't want to go around calling variables from the dataframe, you could attach(V) (though I personally don't ever do it).

# Initialize values values <- 1:100  # V for variables V <- data.frame(a=NA, b=NA, c=NA, d=NA, e=NA)  # Assign elements from a vector V[, c("a", "b", "e")] = values[c(2,4, 8)]  # Also other class V[, "d"] <- "R"  # Use your variables V$a V$b V$c  # OOps, NA V$d V$e 
like image 27
Oscar de León Avatar answered Sep 28 '22 23:09

Oscar de León