【问题标题】:Default argument to function only if condition is met仅在满足条件时才起作用的默认参数
【发布时间】:2019-05-09 06:20:26
【问题描述】:

我目前正在编写一个函数,如果满足条件,我想传递默认参数。如果不满足条件,则不应传递任何参数。我怎样才能做到这一点? 我在这个最小的示例中使用 ifelse 和 NULL 进行了尝试,但它不起作用:

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

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

【问题讨论】:

    标签: r function parameter-passing


    【解决方案1】:

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

    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") 作为测试值和数据值来自是或否的值。

    如果是或否太短,它们的元素被回收。

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

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

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

    【讨论】:

      【解决方案2】:

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

      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")
          }
        }
        ...
      }
      

      【讨论】:

      • 这就是我现在所做的。我只认为您可以在默认参数中实现它。谢谢。
      猜你喜欢
      • 2014-05-01
      • 2018-01-22
      • 2018-09-24
      • 1970-01-01
      • 2011-05-13
      • 2013-06-11
      • 2021-08-25
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多