2017-04-07 34 views
0

我有很多循环组成的长代码。起点是上传的图像,代码通过多个步骤分析图像。仅在来自大文件夹的图像上应用代码

我有100个图像组成的元素,比如Ai,Bi和Ci,制作了诸如“Ai Bj Ck.tif”这样的标题。我定义了i = 1:10,j = 1:10和k = 1:10,但并不是所有选项都存在。例如,图像“A5 B2 C9.tif”不存在。

我想实现代码到一个循环,创建所有可能的图像标题,然后使用if(file.exists(...)){code}选择实际存在的图像,然后运行整个代码第一个图像,然后下一个,依此类推......

为了简化,让代码是简单的图片上传和计算其尺寸:

Image_name = list() 
for(i in 1:10){ 
    for(j in 1:10){ 
     for(k in 1:10)){ 
Image_name[i, j, k] = paste("A", i, "B", j, "C", k, ".tif", sep= "")) 
}}} 

if(file.exists(Image_name)){ 
f = readImage(Image_name) 
dim(f) 
} 

它不工作。它不会创建正确的图像列表,并且不会一次上传一张图像来计算其尺寸。哪里不对?提前致谢!

+0

'... [i,j,k]'用于索引3维数组。你没有这样的数组!第二个备注:'file.exists(...)'将一个字符向量作为参数 - 而不是一个数组而不是一个列表。 – jogo

+1

不能使用list.files(pattern =“* .tif)? –

+0

http://stackoverflow.com/questions/43275406/import-files-using-key-words – jogo

回答

1

您的数据结构错误。 ...[i, j, k]用于索引一个3维数组。你没有这样的数组!第二条评论:file.exists(...)将字符向量作为参数 - 不是数组而不是列表。
你想要的东西,如:

i <- j <- k <- 1:10 
ijk <- expand.grid(i,j,k) 
names(ijk) <- c("i", "j", "k") 
Image_names <- with(ijk, paste0("A", i, "B", j, "C", k, ".tif")) 
ind <- file.exists(Image_names) 
I_files <- Image_names[ind] # existing file names as character vector 

现在,您可以循环在现有的文件名与

lapply(I_files, ...) 
+0

谢谢!不知道expand.grid和与功能,他们可以是有用的:-) – Gabriel123

1

您可以使用list.files()文件夹中列出的文件。在函数内部添加一个路径将告诉R搜索该位置上的所有文件。该功能还允许您输入一个模式,例如所有的tif文件:

I_files = list.files("your_path", pattern = "*.tif", full.names = T) 
# This will give you a character vector with the document names like 
# "your_path/A1B1C1.tif", "your_path/A2B1C1.tif", ... . 

library(EBImage) 
your_images = sapply(I_files, readImage) 
+0

谢谢! – Gabriel123

相关问题