以编程方式改变符号符号
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
我有一个数字向量:
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