R中复制文件名匹配指定列表的文件时file.copy全返回FALSE如何解决
R语言file.copy()全部返回FALSE的原因及解决办法
以下是按优先级排序的排查方向和修复方案:
- 类型不匹配导致筛选结果为空
你用sub()处理得到的文件名前缀是字符型,但control_IDs定义为数值型,R中不同类型的数据做%in%匹配时默认不相等,比如"1" %in% c(1,2,3)返回结果为FALSE,大概率你得到的control_files是长度为0的空向量,自然复制失败。
验证方法:运行length(control_files),如果返回0即可确定是该问题。
修复方案:把control_IDs转成字符型即可:control_IDs <- as.character(c(1,2,3,4)) - 目标文件夹不存在
file.copy()不会自动创建不存在的目标路径,需要先确认目标路径有效。
验证方法:运行dir.exists(here("data")),返回FALSE则需要先创建文件夹:dir.create(here("data"), recursive = TRUE, showWarnings = FALSE) - 目标路径已存在同名文件
file.copy()默认不覆盖已有文件,存在同名文件时会返回FALSE,需要添加覆盖参数overwrite = TRUE。 - 冗余代码问题
你代码中的file.path(control_files)属于冗余写法,list.files已经指定了full.names = TRUE,control_files本身就是合法的全路径,不需要额外嵌套file.path。
修正后完整代码
library(tidyverse) library(here) # 转成字符型避免类型不匹配 control_IDs <- as.character(c(1,2,3,4)) files <- list.files(here("data", "user_files_2021"), full.names = TRUE) control_files <- files[sub("\\.csv$", "", basename(files)) %in% control_IDs] # 先确认目标文件夹存在 dir.create(here("data"), recursive = TRUE, showWarnings = FALSE) # 执行复制,添加覆盖参数 file.copy(control_files, here("data"), overwrite = TRUE)
如果以上操作后还是返回FALSE,可额外排查两个点:
- 运行
file.exists(control_files),确认所有源文件路径真实存在,排除筛选逻辑的隐形问题(比如文件名有多余前缀、空格、特殊字符等) - 确认当前R进程对源文件夹有读权限、对目标文件夹有写权限,可尝试手动复制文件到对应路径验证权限。
内容的提问来源于stack exchange,提问作者Dr Wampa
相关产品推荐
相关产品推荐

