比较两个不同列表的元素

时间:2016-10-25 12:52:54

标签: r

我有两个参数列表,一个列表包含参数值(下面的例子中为parameters),另一个列表包含每个参数可以采用的所有枚举值(parameters.enum)。 / p>

参数不是必需的,因此它们可以是NULLparameters.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

对于NULL中的每个非parameter参数,并在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 = "")
  }
}

但我觉得可以有更直接和优雅的方式实现这一目标,你有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

这是一种循环参数并使用match.arg的方法。结果是一个可用于进一步处理的列表:

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