R 是否可以引用默认值的参数列表?
R Is it possible to refer to argument list of default values?
对此 的跟进,有没有一种方法可以在不使用外部 constant/variable 的情况下引用默认值的参数列表?
例如下面,是否可以不在函数外设置而引用默认值的各个参数列表?
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]"
不是句法,但仍然是一种语言特征,答案在 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)
}
对此
例如下面,是否可以不在函数外设置而引用默认值的各个参数列表?
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]"
不是句法,但仍然是一种语言特征,答案在 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)
}