Home > Software engineering >  Varying Symbols of sign programmatically
Varying Symbols of sign programmatically

Time:10-17

I have a vector of numbers:

v1 <- c(1,2,3)

and I want to programmatically analyze the impact of sign change whose variants could be:

v1[1]   v1[2]   v1[3] 
[1] 6
v1[1]   v1[2] - v1[3] 
[1] 0
v1[1] - v1[2] - v1[3] 
[1] -4
v1[1] - v1[2]   v1[3] 
[1] 2

How can I exchange signs (' ', '-') programatically? I'm thinking this is a silly question, but can't think my way out of my box, though my line of analysis points to evaluating changing signs.

CodePudding user response:

Here's a quick way to get all possibilities with matrix multiplication:

signs = rep(list(c(1, -1)), length(v1))
signs = do.call(expand.grid, args = signs)

signs$sum = as.matrix(signs) %*% v1
signs
#   Var1 Var2 Var3 sum
# 1    1    1    1   6
# 2   -1    1    1   4
# 3    1   -1    1   2
# 4   -1   -1    1   0
# 5    1    1   -1   0
# 6   -1    1   -1  -2
# 7    1   -1   -1  -4
# 8   -1   -1   -1  -6

If you don't want all combinations, you could filter down the signs data frame to the combos of interest, or build it in a way that only creates the combos you care about.

CodePudding user response:

You may use gtools::permutations to get all possible permutations of signs, use apply to evaluate the values for each combination.

v1 <- c(1,2,3)
sign <- c(' ', '-')

all_comb <- gtools::permutations(length(sign), length(v1) - 1, v = symbols, repeats.allowed = TRUE)

do.call(rbind, apply(all_comb, 1, function(x) {
  exp <- do.call(sprintf, c(fmt = gsub(',', ' %s', toString(v1)), as.list(x)))
  data.frame(exp, value = eval(parse(text = exp)))
}))

#        exp value
#1 1 - 2 - 3    -4
#2 1 - 2   3     2
#3 1   2 - 3     0
#4 1   2   3     6
  • Related