在tidyverse中,如何获取purrr::walk中的当前迭代次数?

In the tidyverse, how can I get the number of the current iteration in purrr::walk?

我正在尝试使用 purrr 来迭代 tibble 的行。 tibble 的列之一 它本身是一个逗号分隔的字符串,我还需要对其进行迭代,我正在使用辅助函数进行迭代。

就上下文而言,我真正想做的是通过 URL 下载产品图片并通过型号命名。但是,我知道让其他 运行 代码执行下载是一种不好的形式,所以我认为下面的字符串构造在概念上可以作为等效示例,只是使用打印语句而不是下载。

一个代表:

library(tidyverse)
df1 <- tibble(
  name = c("ModelA", 
           "ModelB"),
  urls = c("URL_A", 
           "URL_B1, URL_B2")
)

make_string <- function(name, string_list){
  string_list %>% 
    str_split(", ") %>% 
    unlist() %>% 
    walk(~(
      # This will be a download.file statment in my actual case.
      print(str_c(name, " has a file at ", .x, " and will have filename ", name, "(WHAT GOES HERE?).jpg"))
    ))
}

df1 %>%
  walk2(.x = .$name,
        .y = .$urls,
        .f = ~make_string(.x, .y)
          )
#> [1] "ModelA has a file at URL_A and will have filename ModelA(WHAT GOES HERE?).jpg"
#> [1] "ModelB has a file at URL_B1 and will have filename ModelB(WHAT GOES HERE?).jpg"
#> [1] "ModelB has a file at URL_B2 and will have filename ModelB(WHAT GOES HERE?).jpg"

reprex package (v2.0.1)

于 2022-04-05 创建

问题是模型 B 文件的文件名是相同的,我需要它们是不同的。我的想法是附加 walk 语句当前迭代的编号(索引?),但我不知道该怎么做。

如果我可以获得生成输出的代码:

#> [1] "Model A has a file at URL_A and will have filename ModelA-1.jpg"
#> [1] "Model B has a file at URL_B1 and will have filename ModelB-1.jpg"
#> [1] "Model B has a file at URL_B2 and will have filename ModelB-2.jpg"

然后我希望我可以调整它来执行我需要的下载和命名。

我该怎么做?

我早该猜到。 iwalk 成功了。

make_string <- function(name, string_list){
  string_list %>% 
    str_split(", ") %>% 
    unlist() %>% 
    iwalk(~(
      print(str_c(name, " has a file at ", .x, " and will have filename ", name, "-", .y, ".jpg"))
    ))
}