2016-10-25 11 views
1

2つのパラメータのリストがあり、1つのリストにはパラメータの値(以下の例ではparameters)が含まれ、もう1つには各パラメータが取りうる列挙された値(parameters.enum)がすべて含まれています。2つの異なるリストの要素を比較する

パラメータは必須ではないため、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]])) 
    } 
}) 
関連する問題