以编程方式改变符号符号

Varying Symbols of sign programmatically

我有一个数字向量:

v1 <- c(1,2,3)

我想以编程方式分析符号变化的影响 变体可以是:

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

如何以编程方式交换符号(“+”、“-”)?我认为这是一个愚蠢的问题,但我想不出自己的出路,尽管我的分析线指向评估不断变化的迹象。

这里有一个快速获得矩阵乘法所有可能性的方法:

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

如果您不想要所有组合,您可以将 signs 数据框过滤为感兴趣的组合,或者以仅创建您关心的组合的方式构建它。

您可以使用 gtools::permutations 获取所有可能的符号排列,使用 apply 评估每个组合的值。

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