在map()循环外更新vector,使用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()之外更新某个东西?

如果您只是将其更改为使用叠加赋值操作符<<-,那么您尝试的方法实际上是有效的。

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

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

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

最新更新