2016-10-25 106 views
1

我有兩個參數列表,一個列表包含參數值(parameters,下例),另一個列表包含每個參數可以採用的所有枚舉值(parameters.enum)。比較兩個不同列表的元素

參數不是強制性的,所以它們可以是NULL。所有參數未在parameters.enum中定義,如果參數在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 

對於parameter每個非NULL參數和parameters.enum定義,我想檢查,如果他們採取了有效的值。如果不是,我想顯示一條消息,例如:'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]])) 
    } 
}) 
相關問題