【问题标题】:Removing empty files in R: Error in if (!file.size(x) == 0) { : missing value where TRUE/FALSE needed [duplicate]删除 R 中的空文件:if (!file.size(x) == 0) { 中的错误:需要 TRUE/FALSE 的缺失值 [重复]
【发布时间】:2021-01-12 02:28:17
【问题描述】:

我知道以前有人问过类似的问题,但我不明白如何解决此错误或在以前的帖子中找到任何解决方案。

CTCF_intersect_files<-list.files(paste(intersect_bed_path,"CTCF/",sep=""))
length(CTCF_intersect_files) #762

CTCF_intersection=lapply(CTCF_intersect_files, 
function(x) {

#Load in "x" file skipping empty files
t_CTCF=if (!file.size(x) == 0) {
read.table(x, header=FALSE)
}
})

Error in if (!file.size(x) == 0) { :
  missing value where TRUE/FALSE needed

【问题讨论】:

  • x 作为文件不存在。我建议您使用file.exists(x) 进行测试。注意file.size("file_does_not_exist.txt")NA,然后看stackoverflow.com/q/7355187/3358272
  • 如果您使用list.files 创建了CTCF_intersect_files,也许您应该添加list.files(..., full.names=TRUE) 以便也包含路径(相对或绝对,取决于您如何称呼它)。
  • 第三个选项:if (isTRUE(file.size(x) &gt; 0)) read.table(...),虽然这并不能解决您期望文件存在但它不存在的根本问题。
  • 我相信错误来自!file.size(x) == 0。这否定了file.size,而不是等于零。
  • 如果您查看CTCF_intersect_files,您会看到文件名。在我的第一条评论中,我建议检查文件是否存在。 file.exists(CTCF_intersect_files[1]) 返回什么?如果您查找其中一个文件名,您会发现它们在当前目录中不存在。 R不会推断(坦率地说,没有语言会)当你说“读取文件quux.txt时,你的意思是“读取@987654336在我提供给不同函数调用一个或多个表达式之前的子目录中找到的 @".

标签: r


【解决方案1】:

这里有两个针对您的代码的修复。

  1. 您正在查找文件的子目录,但默认操作(尽管它很糟糕)是只返回文件名,而不是实际访问这些文件所需的完整路径。例如,

    list.files(path = "dirname")
    # [1] "file1"   "file2"
    list.files(path = "dirname", full.names = TRUE)
    # [1] "dirname/file1"   "dirname/file2"
    

    因此,无论您调用list.files,只需添加full.names = TRUE,您将解决您的文件都不存在的事实。这解决了您还不知道的问题,但正在解决您看到的错误的真正原因。

  2. 您对file.size 的测试如果存在缺陷,即尝试读取未找到的文件将返回NA。当我遇到代码问题时,我的故障排除技术是实际尝试每个子组件,看看有什么问题。在您的情况下,由于 if 语句导致错误失败,我会尝试运行每个组件。

    我猜如果你这样做,它看起来像:

    (!file.size(x) == 0)
    # [1] NA
    file.size(x) == 0
    # [1] NA
    file.size(x)
    # [1] NA
    

    既然你知道函数file.exists,那么你可以试试

    x
    # [1] "somefile.txt"
    read.table(x)
    # Warning in file(file, "rt") :
    #   cannot open file 'somefile.txt': No such file or directory
    # Error in file(file, "rt") : cannot open the connection
    file.exists(x)
    # [1] FALSE
    

我建议记下这些笔记并调整您的代码:

CTCF_intersect_files <- list.files(paste(intersect_bed_path, "CTCF/", sep = ""),
                                   full.names = TRUE)
CTCF_intersection <- lapply(
  CTCF_intersect_files, 
  function(x) {
    if (isTRUE(file.size(x) > 0)) {
      read.table(x, header=FALSE)
    }
  })

在这种情况下,我们不需要实际调用file.exists(x),因为isTRUE(file.size(x) &gt; 0) 会正确处理x 不存在的时间。

然而,我会觉得通过这个并且没有得到任何指示很烦人。此快速检查将确保您满足此假设:

stopifnot(all(file.exists(CTCF_intersect_files))
CTCF_intersection <- lapply( ... )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2022-07-27
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    相关资源
    最近更新 更多