2016-10-25 7 views
1

두 개의 매개 변수 목록이 있습니다. 하나의 목록에는 매개 변수 값 (아래 예제에서는 parameters)이 포함되어 있고 다른 목록에는 각 매개 변수가 취할 수있는 열거 값 (parameters.enum)이 모두 들어 있습니다.두 개의 서로 다른 목록의 요소 비교

매개 변수는 필수가 아니므로 NULL이 될 수 있습니다. parameters.enum에 모든 매개 변수가 정의되어 있지 않습니다. 매개 변수가 parameters.enum에 누락 된 경우이 매개 변수에는 제한된 값이 없습니다. 각 비 NULLparameter에서 매개 변수 및 parameters.enum에 정의 된 나는 그들이 유효한 값을 가지고 있는지 확인하고 싶습니다 들어

parameters.enum <- list(a = c("a1", "a2"), 
         b = c("b1", "b2"), 
         c = "c1") 

parameters <- list(a = "a1", #allowed 
        b = "a1", #not allowed 
        c = NULL, #allowed 
        d = "aaa") #allowed 

. 그렇지 않은 경우 메시지를 표시하고 싶습니다 (예 : 'b' should be one of "b1", "b2"). 당신이 어떤 생각을해야합니까,

for (i in seq_along(parameters)) { 
    j <- which(names(parameters.enum) == names(parameters[i])) 
    if (length(j) != 0L && !is.null(parameters[[i]]) && !parameters[[i]] %in% parameters.enum[[j]]) { 
    cat("Parameter \'", names(parameters[i]), "\' should be one of ", paste0("\"", parameters.enum[[j]], "\"", collapse = ", "), sep = "") 
    } 
} 

을하지만 이것을 달성하기 위해 더 간단하고 우아한 방법이있을 수 있습니다 같은 느낌 : 순간

나는 내가 원하는 것을 달성하기 위해 루프를 사용합니까? 감사 !

답변

2

다음은 매개 변수를 반복하고 match.arg을 사용하는 방법입니다. 결과는 추가 처리에 사용할 수있는 목록입니다.

results <- lapply(names(parameters), function(i) { 
    if (!is.null(parameters.enum[[i]])) { 
    try(match.arg(parameters[[i]], parameters.enum[[i]])) 
    } 
})