I’d like to mutate a column with different tempfiles. How can I do it, given that tempfile() isn’t vectorized?
The following code simply returns the same tempfile.
library(dplyr)
df <- tibble(foo = 1:5)
df |>
mutate(my_tmp_file = tempfile())
#> # A tibble: 5 × 2
#> foo my_tmp_file
#> <int> <chr>
#> 1 1 /var/folders/6g/tmb5z48550s3dl4dp56dvy780000gp/T//RtmpHag8uI/file5cb067…
#> 2 2 /var/folders/6g/tmb5z48550s3dl4dp56dvy780000gp/T//RtmpHag8uI/file5cb067…
#> 3 3 /var/folders/6g/tmb5z48550s3dl4dp56dvy780000gp/T//RtmpHag8uI/file5cb067…
#> 4 4 /var/folders/6g/tmb5z48550s3dl4dp56dvy780000gp/T//RtmpHag8uI/file5cb067…
#> 5 5 /var/folders/6g/tmb5z48550s3dl4dp56dvy780000gp/T//RtmpHag8uI/file5cb067…
I thought I could mutate with purrr::map(), supplying tempfile() as the function, but map() requires also .x which I don’t have/need, so I get an error of argument ".x" is missing, with no default.
What else can I do?
>Solution :
You can use replicate:
df |>
mutate(tf = replicate(n(), tempfile()))
# # A tibble: 5 × 2
# foo tf
# <int> <chr>
# 1 1 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2818ba128f"
# 2 2 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2849741e4"
# 3 3 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2816206e5c"
# 4 4 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2831543f8c"
# 5 5 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2813456146"
Or if foo is guaranteed-unique, you can use foo as part of the name,
df |>
mutate(tf = paste0(tempfile(), "_", foo))
# # A tibble: 5 × 2
# foo tf
# <int> <chr>
# 1 1 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2834c2b5_1"
# 2 2 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2834c2b5_2"
# 3 3 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2834c2b5_3"
# 4 4 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2834c2b5_4"
# 5 5 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2834c2b5_5"
If you really want/need to use purrr, then tempfile() can still be used, we’ll ignore the .x:
df |>
mutate(tf = purrr::map_chr(foo, ~ tempfile()))
# # A tibble: 5 × 2
# foo tf
# <int> <chr>
# 1 1 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a28487ffb9"
# 2 2 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2839cf352e"
# 3 3 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a286e5c5cce"
# 4 4 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a2825b6280"
# 5 5 "C:\\Users\\r2\\AppData\\Local\\Temp\\Rtmp2REMs5\\file3a286a1f9e6"