使用copy.file有点问题。
我需要根据另一个文件目录中文件的名称,从具有几个子目录(.tif文件所在的目录)的目录中复制.tif文件。我有以下代码(几乎可以运行)
ValidatedDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Validated"
RawDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Raw"
OutputDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Ouputfolder"
ValidatedImages <- list.files(ValidatedDirectory)
# this is to remove the extra bit that is added onto the validated images [working]
pattern <- gsub("_hc", "", ValidatedImages)
pattern <- paste(gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", pattern), collapse="|")
# this bit tackles finding the relevant files based on the ValidatedImages
filesinRAW <- list.files(
path = RawDirectory,
recursive = TRUE,
include.dirs = FALSE,
full.names = FALSE)
filesinRAW <- as.list(filesinRAW)
# this removes subdirectory prefix in front of the file and .tif which confuses it
filesinRAW <- as.list(gsub("\\d\\d\\d\\d/", "", filesinRAW))
filesinRaw <- as.list(gsub(".tif", "", filesinRAW))
tocopy <- grep(filesinRAW, pattern = pattern, value = TRUE)
tocopy <- as.list(tocopy)
tocopy <- as.list(gsub(".tif", "", tocopy))
setwd(RawDirectory)
file.copy(from = tocopy, to = OutputDirectory, overwrite = TRUE)
我收到No such file or directory
错误,文件确实存在(显然),因此我在命名上一定做错了。
我已经花了很长时间了,如果有帮助,我可以上传示例数据并共享链接。
感谢任何帮助社区!
答案 0 :(得分:2)
在调试时,请尝试分解代码,以查看每个步骤中的变量是否仍然符合您的期望。
也就是说,我现在在您的代码中看到了几个问题:
pattern
作为长度为一的正则表达式。如果为它提供多个正则表达式,它将使用第一个(带有警告,如果禁用了它们,则不会显示警告)。apply
和sapply
:filesinRAW[apply(sapply(pattern, grepl, x=filesinRAW), 2, any)]
。但是请看最后一点grep('^test', '^test')
给出零结果。要检查字符串是否包含文字字符串,可以使用grep(..., fixed=TRUE)
sub(".tif", "", to copy)
,它将删除任何样式,例如.tif。我想您打算在末尾再次 add .tif,现在您正在尝试复制没有扩展名的文件,但找不到扩展名。要添加,可以使用paste
。as.list
。为什么?在R中,所有内容都是矢量化的,这意味着已经使用了多个值。列表和向量之间的区别在于列表可以存储不同类型的对象,但是您还是不会这样做。据我所知,as.lists并没有任何害处,因为所有功能都将首先将您的列表转换回字符向量。pattern
),然后将其与文件的完整列表进行比较。然后您尝试使其完全匹配。那为什么要使用正则表达式呢?如果只知道文件名的一部分,那么正则表达式就很有用,但这是您的目标。例如。如果filename1._hc
在您的ValidatedDirectory中,是否还需要复制文件filename11.tif
和filename12.tif
?
如果您只是在寻找完全匹配的内容,则可以直接进行比较:tocopy <- tocopy[tocopy %in% pattern]
但是通常,在R中工作很容易,因为您可以逐步进行所有操作,并且如果您仅检查tocopy
,就可以看到您的通话是否有意义。
答案 1 :(得分:0)
在@Emil Bode的大力帮助下,我对这个问题有以下解决方案(也许不是最优雅的方法,但是它可以在数千个.tif文件上运行得足够快。
ValidatedDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Validated"
RawDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Raw"
OutputDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Ouputfolder"
ValidatedImages <- list.files(ValidatedDirectory)
pattern <- gsub("_hc", "", ValidatedImages)
pattern <- paste(gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", pattern), collapse="|")
filesinRAW <- list.files(
path = RawDirectory,
recursive = TRUE,
include.dirs = FALSE,
full.names = FALSE,
pattern = pattern)
setwd(RawDirectory)
file.copy(from = filesinRAW, to = OutputDirectory, overwrite = TRUE)