首页 > 解决方案 > 仅在满足条件时才起作用的默认参数

问题描述

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

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

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

标签: rfunctionparameter-passing

解决方案


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

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返回的事实

与来自 yes 或 no 值的测试和数据值具有相同长度和属性(包括维度和“类”)的向量。

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

在错误消息中看到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其他警告。


推荐阅读