使用 R 在 map() 循环外更新向量

Updating a vector outside the loop in map(), using R

我有以下简单向量:

a = c(1,0,0,1,0,0,0,0)

我想得到一个向量(b),这样对于a中的每个指标x,如果a[x]为1,我们就让它保持原样,如果为0,我们计算a[x -1] + 1,直到下一个1:

b = c(1,2,3,1,2,3,4,5) 

我试过使用 map():

map(
  .x = seq(1,(length(a))),
  .f = function(x) {
    a[x] = ifelse(a[x]==1, a[x], a[x-1]+1)
    a})

显然这不起作用,因为 map 不更新 a 向量。我如何使用 map() 来做到这一点。甚至可以更新 map() 之外的东西吗?

也许接近您正在寻找的解决方案(即模仿 for loop)是 purrr::accumulate

accumulate(1:8, .f = ~ ifelse(a[.y] == 1, 1, .x + 1))
#[1] 1 2 3 1 2 3 4 5

如果您只是将其更改为使用超赋值运算符 <<-,您尝试的方式实际上是可行的。

a = c(1,0,0,1,0,0,0,0)

map(
  .x = seq(1,(length(a))),
  .f = function(x) {
    a[x] <<- ifelse(a[x]==1, a[x], a[x-1]+1)
    a})
a

#> [1] 1 2 3 1 2 3 4 5