默认参数仅在满足条件时起作用

时间:2018-12-07 13:12:11

标签: r function parameter-passing

我当前正在编写一个函数,如果满足条件,我想传递默认参数。如果不满足条件,则不应传递任何参数。我该如何实现? 在这个最小的示例中,我使用ifelse和NULL进行了尝试,但是没有用:

my_function <- function(.data,
                        .variable = ifelse("var1" %in% names(.data), "var1", NULL)){
  ...
}

如果“ var1”不是.data的变量名,并且我没有在.variable上传递另一个参数,我想得到一个错误,例如“参数“ .variable”丢失,没有默认值”。我的解决方案有效,但是我收到其他错误消息。

2 个答案:

答案 0 :(得分:0)

在条件为ifelse的情况下,似乎NULL不喜欢以FALSE作为响应:

ifelse(2 < 1, 1, NULL)
# Error in ans[!test & ok] <- rep(no, length.out = length(ans))[!test &  : 
#   replacement has length zero
# In addition: Warning message:
# In rep(no, length.out = length(ans)) :
#   'x' is NULL so the result will be NULL

似乎是由于ifelse返回

  

具有相同长度和属性(包括尺寸和   “ class”)作为测试值和来自yes或no值的数据值。

  

如果是或否太短,则将其元素回收。

在错误消息中看到replength(NULL)为零的事实似乎是一个很好的证据。因此,您可能想使用例如

my_function <- function(.data, .variable = if("var1" %in% names(.data)) "var1" else NULL)
  is.null(.variable)

my_function("1")
# [1] TRUE

有关其他警告,请参见?ifelse

答案 1 :(得分:0)

我建议不要直接在默认参数中执行此操作,而应在函数开始时执行以下操作:

my_function <- function(.data,
                        .variable = NULL) {
  if (is.null(.variable)) {
    if ("var1" %in% names(.data)) {
      .variable = "var1" 
    } else {
      stop(".variable undefined with no suitable default")
    }
  }
  ...
}