2014-05-12 2 views
0

I는 1과 3 사이 w 값에 소요 3 개 분포 중 하나 n 값을 돌려주는 함수를 개발 해요특정 값에 대해 재귀 적 응용 프로그램을 설치하는 방법 ex.w [i] == n [i]?

배경. 내가 가지고있는 문제는 n 또는 w 길이가 1이 아닐 때입니다. 따라서 원하는 기능을 생성하기 위해 nIsListwIsList 매개 변수를 2 개 추가했습니다. 다음과 같이 나는이 작업 할 방법은 다음과 같습니다

(작품 필요한 등) (1 승), (2 승), 소비 소비 실행에 대한 목록과 동등한 소비

If nIsList ex(c(1,2,3)) 반환 실행하는리스트 당량 (1, N)를 소비

If wIsList ex(c(1,2,3)) 창 (을 필요 작품) (3 승)

소모 (2, N), 소비 (3, N)

(필요대로 작동하지 않습니다) 실행에 대한 목록과 동등한 소비

If nIsList ex(1,2,3) and wIsList ex(1,2,3) 수익률 (1,1), 소비 (2, 2), 소비 (3,3). 대신, 나는 [소비 (1,1), 소비 (1,2), 소비 (1,3)], [소비 (2,1), 소비 (2,2), 소비 , 3)], [소비 (3,1), 소비 (3,2), 소비 (3,3)]

내가 얻는 결과가 왜 나는지 이해한다. 나는 내가 원하는 결과를 얻는 방법을 알아낼 수 없다. ([1], N [1] W) wIsList & nIsList이 때

난 함수 w 각 요소의 목록을 제공 할 및 N이 소비이다

질문 (같이 위에서 설명) 참된. lapply를 사용하여이를 수행 할 수있는 방법이 있습니까?

코드 :

library("triangle") 
consume <- function(w, n=1, nIsList=F, wIsList=F){ 
    if(!nIsList & !wIsList){ 
    if(w==1){ 
     return(rtriangle(n,0.3,0.8)) 
    }else if(w==2){ 
     return(rtriangle(n,0.7,1)) 
    }else if(w==3){ 
     return(rtriangle(n,0.9,2,1.3)) 
    } 
    } 
    else if(nIsList & !wIsList){ 
    return(sapply(n, consume, w=w)) 
    } 
    else if(nIsList & wIsList){ 
    return(lapply(n, consume, w=w, wIsList=T)) 
    } 
    else if(!nIsList & wIsList){ 
    return(lapply(w, consume, n)) 
    } 
} 

참고 : 나는 문제가이 질문을 요약을 데. 이름 바꾸기에 대한 제안 사항이 있으면 알려 주시기 바랍니다.

+1

'mapply'을 보셨습니까? 그럴 것 같아 – JPC

+0

정말 고마워요 !! 그게 해결 됐어! – sbeleidy

+0

괜찮아요. 문제는 없습니다. 휴대 전화에 답변을 입력 할 수 없었던 미안합니다 : p – JPC

답변

0

JPC의 의견 덕분에 mapply을 사용하면 트릭을 수행합니다. 새로운 코드는 다음과 같습니다 :

consume <- function(w, n=1){ 
    nIsList <- length(n) > 1 # Change based on JPC's second comment 
    wIsList <- length(w) > 1 # Change based on JPC's second comment 
    if(!nIsList & !wIsList){ 
    if(w==1){ 
     return(rtriangle(n,0.3,0.8)) 
    }else if(w==2){ 
     return(rtriangle(n,0.7,1)) 
    }else if(w==3){ 
     return(rtriangle(n,0.9,2,1.3)) 
    } 
    } 
    else if(nIsList & !wIsList){ 
    return(sapply(n, consume, w=w)) 
    } 
    else if(nIsList & wIsList){ 
    return(mapply(consume,w,n)) ## Updated portion 
    } 
    else if(!nIsList & wIsList){ 
    return(lapply(w, consume, n)) 
    } 
} 
+1

btw, 'n'또는 'w'의 길이를 계산하여 목록 (예 :'lenght w)> 1'이므로'isList' 매개 변수를 전달해야하는 것을 피할 수 있습니다. – JPC

+0

나는 이것을 수행하는 것에 대해 논쟁을 벌였습니다. 때때로 함수가 실제 속성 대신 사용 된 벡터의 길이를 사용하기를 원합니다. 함수를 이런 식으로 작업하는 대신 매개 변수로 입력하십시오. 업데이트 할 것입니다. 감사합니다! – sbeleidy