使用 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
我有以下简单向量:
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