文件名和文件大小未加载到R基础数据框中

bweufnob  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(123)

我是一个学生,有基本的R编程类和任务之一是创建一个自定义函数命名为sizeReport(),它有给定的参数:

  • path:目录的路径(字符串),
  • patt:过滤报告的文件/目录的正则表达式(regex、string),默认为“.*",
  • dironly:逻辑值(布尔型),用于切换是报告所有文件还是仅报告目录,默认值为FALSE,
  • level:指定递归深度(整数),默认为Inf.

下面是一个典型的基本函数调用,在这个调用中,我们只使用path参数,并以关系方式指定目录的路径(您也可以使用直接路径,例如文件夹)。其他参数采用默认值,例如level = Inf,这将导致目录的完整搜索(列出目录、所有子目录等中的所有项),patt =“.*”,因此列出所有项,以及dironly = FALSE,因此列出所有项而不仅仅是目录。

path     size
1                                            ../ 13849765
2                                   ..//cars.csv 12536233
3                                  ..//projekt-1    33789
6                     ..//projekt-1/project.html    25164
7                      ..//projekt-1/project.org     8625
8                             ..//projekt-1/test        0
4                                  ..//projekt-2  1041209
9  ..//projekt-2/A-List-Of-Epidemics_examples.nb   823182
10                ..//projekt-2/disease_data.csv     9109
11                  ..//projekt-2/event_data.csv      165
12                        ..//projekt-2/fig1.png     9954
13                        ..//projekt-2/fig2.png    27818
14                        ..//projekt-2/fig3.png    21237
15                        ..//projekt-2/fig4.png    16929
16                        ..//projekt-2/fig5.png    24854
17                        ..//projekt-2/fig6.png    24854
18                        ..//projekt-2/fig7.png    19974
19                    ..//projekt-2/project.html    18842
20                   ..//projekt-2/project.html~    18392
21                     ..//projekt-2/project.org    15587
22                    ..//projekt-2/project.org~    10312
5                                  ..//projekt-3   238534
23                      ..//projekt-3/analiza.nb     1780
24                       ..//projekt-3/fig_1.png    32498
25                       ..//projekt-3/fig_2.png    72864
26                       ..//projekt-3/fig_3.png    90707
27                    ..//projekt-3/project.html    14314
28                   ..//projekt-3/project.html~    14313
29                     ..//projekt-3/project.org     6648
30                    ..//projekt-3/project.org~     5410

下一个例子和上面的调用是一样的,但是路径是以绝对的方式给出的。显示的宽度由于路径的长度而改变。但是,除此之外,结果是相同的。在进一步的例子中,我将把自己限制在与工作目录相关的路径上。
我试着写这个代码:

sizeReport <- function(path, patt = ".*", dironly = FALSE, level = Inf) {
  
  files <- data.frame(name = character(), size = numeric())
  

  walkDir <- function(path, level) {
   
    filesInDir <- list.files(path, recursive = FALSE)

    for (file in filesInDir) {
    
      fullPath <- file.path(path, file)
     
      if (dironly && !dir.exists(fullPath)) {
        next
      }
      
      if (dir.exists(fullPath) && level > 0) {
        walkDir(fullPath, level - 1)
      } else {
        
        if (!dir.exists(fullPath) && grepl(patt, file)) {
          files <- rbind(files, data.frame(name = fullPath, size = file.size(fullPath)))
        }
      }
    }
  }
  
  
  walkDir(path, level)
  
  
  return(files)
}
sizeReport("../")

filesInDir <- list.files("../", recursive = FALSE)
filesInDir

但它不起作用。当使用

sizeReport(path = "../")

它只显示了这一点:

[1] name size
<0 rows> (or 'row.names' with 0 length)

当我使用代码的filesInDir位时:

filesInDir <- list.files(path, recursive = FALSE)

它以矢量形式显示文件名:

[1] "fUNKCJA JAKAS TAM.R"                "Labirynt"                          
[3] "Mapa.r"                             "sizeReport"                        
[5] "Zrzut ekranu 2022-12-13 232400.png"

所以把它们加载到dataframe中应该没有任何问题。我做错了什么?

aiazj4mn

aiazj4mn1#

欢迎来到stackoverflow。
您需要在行中使用超级赋值<<-,而不是赋值运算符<-

files <<- rbind(files, data.frame(name = fullPath, size = file.size(fullPath)))

在我看来,对于常规赋值,R在每次迭代中创建一个新的局部变量,该变量对于其他函数调用是不可见的。

sizeReport <- function(path, patt = ".*", dironly = FALSE, level = Inf) {
  
  files <- data.frame(name = character(), size = numeric())
  

  walkDir <- function(path, level) {
   
    filesInDir <- list.files(path, recursive = FALSE)

    for (file in filesInDir) {
    
      fullPath <- file.path(path, file)
     
      if (dironly && !dir.exists(fullPath)) {
        next
      }
      
      if (dir.exists(fullPath) && level > 0) {
        walkDir(fullPath, level - 1)
      } else {
        
        if (!dir.exists(fullPath) && grepl(patt, file)) {
          files <<- rbind(files, data.frame(name = fullPath, size = file.size(fullPath)))
        }
      }
    }
  }
  
  
  walkDir(path, level)
  
  
  return(files)
}
sizeReport("../")

相关问题