首页 > 解决方案 > 跨不同目录将一个函数的列表传递给另一个函数

问题描述

我正在尝试将随机数分配给各种目录中的文件副本(复制起来很棘手)。目录结构如下:

1100    
1100/Images

我首先创建新目录并复制图像。为此,我有以下工作

NewImageGen <- function(singledir){
  #
  Directoryforrandoms <- "RandomNumAsignment"
  Directoryforrandoms <- paste(singledir, "/", Directoryforrandoms, sep = "")
  dir.create(Directoryforrandoms,
             showWarnings = F)
  #
  Imagedir <- paste(singledir, '/Images', sep = '')
  filestocopy <- list.files(Imagedir,
                            recursive = F,
                            full.names = T)
  file.copy(from = filestocopy,
            to = Directoryforrandoms,
            overwrite = F)
  #
  newfiles <- list.files(path = Directoryforrandoms,
                         pattern = ".tif", # they are all tiff files
                         full.names = T)
  #
  return(newfiles)
}
NewImages <- pblapply(alldirs, FUN = NewImageGen)

这给了我一个很大的列表,分为四个(因为在这个实例中有四个目录)。我想将它传递newfiles给另一个函数,该函数生成一个随机数前缀并将其粘贴在前面。我可以使用以下方法对常规文件列表执行此操作:

RandomNumGen <- function(singleimg){
  randomnumber <- as.character(sample(100000:999999, 1, replace=F))
  singlerename <- sub('^', randomnumber, singleimg)
  file.rename(from = singleimg,
              to = singlerename)
}

它遍历列表的所有元素,但返回一个令人沮丧的false.

任何帮助都是一流的!

标签: rdirectoryapply

解决方案


pblapply()返回一个listwhilelist.files()返回一个字符向量。list.files()因此,如果您的函数适用于尝试将您的调用从 更改pblapply()为的返回值pbsapply()

编辑:

newfiles,即NewImageGen()函数的返回值,包含完整路径(如您full.names = T在上次list.files()调用中设置的那样)。

sub('^', randomnumber, singleimg)将在路径的第一部分之前添加随机数,例如677570/home/Jim/1100/Images/RandomNumAsignment/original_image_name.tif.

相反,你想做

file.path(dirname(singleimg), sub('^', randomnumber, basename(singleimg))

推荐阅读