在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"))
))
}
我正在尝试使用 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"))
))
}