if 语句 returns 每个分支上的不同变量,我如何仅使用一个 <- 运算符对该变量进行子分配?

An if statement returns a different variable on each branch, how can I sub-assign to that variable using only one <- operator?

考虑

a <- b <- 1:3
if(sample(2, 1) == 1) a[2] <- 5 else b[2] <- 5

这是重复的。我不想写 <- 5 两次。最好使用

a <- b <- 1:3
assign(if(sample(2, 1) == 1) "a[2]" else "b[2]", 5)

assign 不适合子赋值。存在哪些惯用的替代方案?

我认为没有惯用的方法可以做到这一点,但肯定可以通过一次赋值来做到这一点:

a <- b <- 1:3
s <- if(sample(2, 1) == 1) "a" else "b"
assign(s, `[<-`(get(s), 2, 5))

a
#> [1] 1 2 3

b
#> [1] 1 5 3

reprex package (v2.0.0)

于 2021-09-26 创建

您可以使用 eval(parse()) 方法。

eval(parse(text=paste(c('a', 'b')[(sample(2, 1) == 1) + 1], '[2] <- 2')))

或简称:

eval(parse(text=paste(sample(c('a', 'b'), 1), '[2] <- 2')))

我认为惯用的方法是不要有两个变量,让它们成为列表中的条目:

l <- list()
l$a <- l$b <- 1:3
var <- sample(c("a", "b"), 1)
l[[var]][2] <- 5
l
#> $b
#> [1] 1 2 3
#> 
#> $a
#> [1] 1 5 3

reprex package (v2.0.0)

于 2021-09-26 创建

你可以通过玩弄环境来获得更接近你所要求的东西:

a <- b <- 1:3
var <- sample(c("a", "b"), 1)
e <- environment()
e[[var]][2] <- 5

reprex package (v2.0.0)

于 2021-09-26 创建

但我不认为这是惯用语。