2014-01-22 44 views
2

我有一個簡單的功能從與他們的名字列表中創建的光柵文件列表(在.GRD格式,並呼籲在下面的例子list_names):如何迭代保存結果格式的列表?

ListRasters <- function(list_names) { 

    raster_list <- list() # initialise the list of rasters 

    for (i in 1:(length(list_names))){ 
    grd_name <- list_names[i] # list_names contains all the names of the images in .grd format 
    raster_file <- raster(grd_name) 
    } 

    raster_list <- append(raster_list, raster_file) # update raster_list at each iteration 
} 

# Apply the function 
raster_list <-lapply(list_names, FUN = ListRasters) 

理想的結果應該是在格式:

[[1]] 
class : RasterLayer 
# etc 

[[2]] 
class : RasterLayer 
# etc 

而是我讓他們在格式:

[[1]] 
[[1]][[1]] 
class : RasterLayer 
# etc 

[[2]] 
[[2]][[1]] 
class : RasterLayer 
# etc 

這是一個問題,因爲後來我無法訪問項目s在柵格列表上。 我找不到解決方案,因爲我不明白爲什麼迭代會提供此格式的結果。你能否給我一些解釋或者關於如何解決這個問題的建議,或者你能看出我犯了什麼錯誤?

任何幫助都比歡迎!

謝謝!

+0

不需要使用'lapply',因爲這會給你一個列表(在你的情況)。改爲使用'raster_list < - ListRasters(list_names)'。在旁註中,你是否知道你只是在'for'循環之後追加到列表中,而不是在代碼註釋中描述的每個迭代步驟中? – fotNelton

+0

「柵格」函數的輸出是什麼? –

回答

2

你的循環似乎有些奇怪。儘管如此,lapply將返回一個列表,也許你應該嘗試sapply

raster_list <-sapply(list_names, FUN = ListRasters) 

我想這應該會給你你想要的。

編輯:

這將是更好,如果你已經把一個最小的可重複的例子,因爲我們不知道數據是如何以及什麼是raster功能,但低於遵循與輸出的差異的玩具例子的lapplysapply

PS:看起來您的公式迭代不正確,但您必須提供更多信息才能修復公式。

list_names <- c("a", "b","c", "d") #defining the list_names 

#defining the function 
ListRasters <- function(list_names) { 

    raster_list <- list() # initialise the list of rasters 

    for (i in 1:(length(list_names))){ 
    grd_name <- list_names[i] # list_names contains all the names of the images in .grd format 
    raster_file <- paste("file", grd_name, sep=".") 
    } 

    raster_list <- append(raster_list, raster_file) # update raster_list at each iteration 
} 

使用lapply

raster_list <-lapply(list_names, FUN = ListRasters) 

的輸出是:

[[1]] 
[[1]][[1]] 
[1] "file.a" 


[[2]] 
[[2]][[1]] 
[1] "file.b" 


[[3]] 
[[3]][[1]] 
[1] "file.c" 


[[4]] 
[[4]][[1]] 
[1] "file.d" 

使用sapply

raster_list <-sapply(list_names, FUN = ListRasters) 

的輸出是:

$a 
[1] "file.a" 

$b 
[1] "file.b" 

$c 
[1] "file.c" 

$d 
[1] "file.d" 
+0

我認爲使用'lapply'或'sapply'並不重要。 'ListRasters'的結果總是一個列表,所以無論哪種方式,迭代列表中的元素都會累積列表。 – fotNelton

+0

@fotNelton是的,它確實很重要,'lapply'會返回一個列表,'sapply'會簡化輸出,我會在上面放一個玩具的例子。 –

+1

感謝您的示例。如果返回的列表長度始終等於原始問題的相同長度(可能是的,但是誰知道;-)),你說的是真的。所以一個反例就是'sapply(1:10,function(n)as.list(rep(3,n)))''。 – fotNelton