2017-04-07 45 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

相關問題