R语言 如何用不同的临时文件改变一个列?

a64a0gku  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(116)

我想用 * 不同的 * 临时文件改变一个列。如果tempfile()没有矢量化,我该怎么做呢?下面的代码只是返回相同的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…

我想我可以用purrr::map()进行变异,提供tempfile()作为函数,但是map()还需要.x,而我没有/需要,所以我得到了argument ".x" is missing, with no default的错误。
我还能做什么?

sf6xfgos

sf6xfgos1#

可以使用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"

或者,如果foo是保证唯一的,则可以使用foo作为名称的一部分,

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"

如果你真的想/需要使用purrr,那么tempfile()仍然可以使用,我们将忽略.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"

相关问题