2012-12-16 4 views
2

이 질문에 대한 변형이있는 것 같지만 루프 및 이름 지정 및 출력 파일에있는 상황을 해결하지 못하는 것 같습니다. 어떻게 생각하니?함수에 변수 이름을 전달하고 루프 내에서 출력하십시오.

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와 SpatialPolygon을 만들었고, 이것을 몇개의 파라미터를 가지는 함수 ("추출")에 건네주고 싶습니다. 몇개의 파라미터는 루프를 조작하고 출력에 라벨을 붙이고 싶습니다. 이것은 BASH의 산들 바람입니다. 그러나 R에서 이것을 이해할 수는 없습니다.

궁극적으로 문자열을 전달하고 싶지만, another post은 거기에있는 것처럼 보입니다.

EDIT : 원래 위의 함수를 단일 데이터 프레임으로 게시했습니다. 실제로는 래스터 패키지 (궁극적으로는 데이터 프레임 임)에서 지정된 개체입니다.

+2

'할당'을 사용하여이를 수행 할 수 있지만 권장하지 않습니다. 대신, R 방식은 각각을 명명 된 목록의 요소로 할당하는 것입니다. 'get '과'assign' 사이에는 많은 로프가 걸려 있지만, 당신의 접근 방식을 재고하고 대신 R이 가지고있는 목록 도구를 사용하는 것이 좋습니다. – Justin

+0

업데이트에 문제가 있습니다. 그것은 레이어 = 17에 대해 추출 [1] km를 반환하고, 레이어 = 17에 대해 [2] km를 추출하고 레이어 = 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="") 
       ) 
      ) 
    ) 
} 

, 나는 나는 목록에 데이터 객체로 변환하는 방법과 그 목록의 모든 요소에 함수를 실행하는 방법을 보여, 그래서 아래 목록 작업을 선호합니다. 이런 방식으로 작업하면 대개 "get"및 "assign"방식으로 문자열을 사용할 필요가 없습니다.

# 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