【问题标题】:R Is it possible to refer to argument list of default values?R 是否可以参考默认值的参数列表?
【发布时间】:2017-05-11 02:02:45
【问题描述】:

跟进这个question about proper checking of parameters against a list of values,有没有办法在不使用外部常量/变量的情况下引用默认值的参数列表?

例如,在下面,是否可以引用默认值的每个参数列表而不将其设置在函数外部?

ISO.open_bracket_left <- c("]", ")") # Current workaround
semi_open_intervals <-
  function(a, b, right_half_open=TRUE,
           open_bracket_left= ISO.open_bracket_left,
           open_bracket_right=c("[", "("))
{
  # See https://en.wikipedia.org/wiki/ISO_31-11
  if (missing(open_bracket_left) || !(open_bracket_left %in% ISO.open_bracket_left))
    open_bracket_left <- ISO.open_bracket_left[1]
  if (missing(open_bracket_right) || !(open_bracket_right %in% c("[", "(")))
    open_bracket_right <- "["

  bracket_left <- "["
  bracket_right <- "]"
  if (right_half_open) bracket_right <- open_bracket_right
  else bracket_left <- open_bracket_left
  paste0(bracket_left, a, ", ", b, bracket_right)
}

## Use case
semi_open_intervals(0, 7, right_half_open = FALSE, open_bracket_left = ")") ## ")0, 7]"
semi_open_intervals(0, 7, right_half_open = FALSE, open_bracket_left = "[[") ## "]0, 7]"

【问题讨论】:

标签: r list function arguments default-value


【解决方案1】:

不是语法,但仍然是语言功能,答案在 base::match.arg 代码和 base::formals 中,另请参阅 function components 以获取描述。

因此,如果确实需要参考默认值的参数列表,而不是解决方法,则可以通过base::formals 来解决。如果您只需要像上面的玩具示例中那样进行简单的参数检查,只需使用完成这项工作的base::match.arg

ISO.open_bracket_left <- c("]", ")") # Current workaround
semi_open_intervals <-
  function(a, b, right_half_open=TRUE,
           open_bracket_left= ISO.open_bracket_left,
           open_bracket_right=c("[", "("))
{
  # See https://en.wikipedia.org/wiki/ISO_31-11
  if (missing(open_bracket_left) || !(open_bracket_left %in% ISO.open_bracket_left))
    open_bracket_left <- ISO.open_bracket_left[1]

  ### Use base, duh!
  open_bracket_right <- match.arg(open_bracket_right)

  bracket_left <- "["
  bracket_right <- "]"
  if (right_half_open) bracket_right <- open_bracket_right
  else bracket_left <- open_bracket_left
  paste0(bracket_left, a, ", ", b, bracket_right)
}

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2012-01-21
    相关资源
    最近更新 更多