2012-12-16 30 views
2

似乎有這個問題的變化,但似乎沒有解決處於循環和命名和輸出文件中的情況。我怎麼想這可能工作:將變量名稱傳遞給R中的函數並輸出內部結果

for(j in 1:3) { 
    for(k in 1:17){ 
     extract_[j]km <- extract(RasterStack, SpatialPolygonsDataFrame_[j]km, layer=[k], nl=1, df=TRUE) 
    } 
} 

提取功能是從柵格包。我已經創建了一系列的RasterStacks和SpatialPolygons,並且我想將它們傳遞給一個函數(「提取」),該函數有幾個參數,其中一些我希望通過循環來處理,並相應地標記輸出。這在BASH中是一件輕而易舉的事,但我無法在R中弄清楚這一點。

最終,我想通過字符串,但another post似乎顯示了這種方式。

編輯:我最初發布上述函數作爲一個單一的數據框,實際上,他們是指定的對象從柵格包(這是最終的數據框)。

+2

您可以使用'assign'來做到這一點,但不建議這樣做。相反,R方式將分配每個作爲命名列表的一個元素。在'get'和'assign'之間有很多繩索可以讓你自己處理,但是會建議你重新思考你的方法,並使用一些R代替的列表工具。 – Justin

+0

您的更新有問題。它將爲layer = 17返回extract [1] km,爲layer = 17提取[2] km併爲layer = 17提取[3] km。 –

+0

對於後代,可以在這裏找到作者的回答函數:http://r-sig-geo.2731867.n2.nabble.com/raster-How-to-loop-extract-function-td7581978.html –

回答

4

正如Justin指出的那樣,使用列表與R的結構相比更加內聯,而不是使用大量命名變量搞亂工作空間。當工作空間中有很多對象「知道」接下來的事情時,它很快就會變得具有挑戰性。

你的道:

for(j in 1:3) { 
assign(
    paste("extract",j,"km",sep=""), # or paste0 to avoid need for sep="" 
    function(
      get(
       paste("data",j,"km",sep="") 
       ) 
      ) 
    ) 
} 

就個人而言,我更喜歡用列表的工作,所以在下面,我是你的數據對象轉換到一個列表,告訴你如何在該列表中的所有元素運行的函數。以這種方式工作通常會降低對「獲取」和「分配」方式使用字符串的需求。

# just converting your variables to a list  
data.list <- mget(grep("data",ls(),value=TRUE),envir=.GlobalEnv) 

# then output results 
result.list <- lapply(data.list,your_function) 
+0

我遇到了'data.list < - mget(grep(「data」,ls(),value = TRUE),envir = .GlobalEnv)'的一個小問題。 grep()似乎與包含字符串「data」的任何東西匹配,所以如果我在工作空間中有一個名爲data.fnc()的對象,它也會檢索它。你碰巧知道任何解決方法嗎? – Alex

+0

它的'通常不好的做法來命名一個對象的'數據',因爲這是一個保留字在基地R.不能看到你的工作空間,我不能「看到」你想要做什麼。然而,也許你可以嘗試:'grep(「data [0-9 *]」,ls(),value = TRUE)' –

+0

我想我明白了列表方法可能對我給出的玩具例子有效,但是我的函數實際上有點複雜。我更新了原文,以更詳細地反映該功能。希望有一種更直接的方法將字符串/數字傳遞給函數。 – Prophet60091

相關問題