为何使用purrr::walk2写入CSV文件时无法生成文件?
问题分析与解决
核心问题1:withr::local_tempfile()的自动清理机制
withr::local_tempfile()的设计逻辑是创建临时文件,并在当前作用域结束后自动删除。你用它作为fwrite的输出路径时,文件刚写完就会被withr自动清理,因此目标目录里找不到文件。
核心问题2:purrr::walk2的不必要使用
你的.y参数是单个固定的目录路径,不需要用walk2(该函数用于两个等长向量的配对循环),用purrr::walk循环.x的取值即可,目录作为固定参数传入更合理。
修正后的代码
library(data.table) library(purrr) # 定义临时目录 pp <- withr::local_tempdir() # 定义写入函数 f <- function(.x, .dir) { dt <- data.table(country = .x, school_id = 1:2, school_type = c("a","b")) # 直接构造固定文件路径,避开local_tempfile的自动清理 file_path <- file.path(.dir, paste0("school.", .x, ".csv")) fwrite(dt, file_path) } # 循环写入文件 purrr::walk(c("at","de"), f, .dir = pp) # 现在可以看到生成的文件 list.files(pp)
补充说明
- 如果需要临时文件但要保留,不要用
withr::local_tempfile(),可改用基础R的tempfile()(不会自动删除),或直接手动构造路径。 walk用于循环单个向量,walk2用于两个等长向量的配对循环,根据场景选择更简洁的函数。
内容的提问来源于stack exchange,提问作者Winfried
相关产品推荐
相关产品推荐

