我应该使用NULL或NA作为可选功能参数的默认值

Ale*_*lex 6 r function

我有一个函数,如果一个非空值提供给另一个可选参数,它会做额外的事情.如果未提供参数,则该函数不会执行任何额外操作.

使用NA或更好NULL吗?两者有什么好处?

例如,如果我使用NA,那么我可以快速检查哪些参数不是通过使用:is.na(as.list(environment()))在函数体中提供的,它不起作用is.null.

这是我想要使用的原因的一个例子 NA

我正在尝试构建一个到Geckoboard条形图API的R连接器.它有许多可选参数.如果我执行以下操作,则使用该包jsonlite提供可选参数非常容易.

get_barchart_json <- function(data, x_axis = list(labels = NA, type = NA), y_axis = list(format = NULL, unit = NULL)){
    payload <- "{"
    textappend(payload) <- '"series": [{"data":['
    textappend(payload) <- paste0(data, collapse = ",")
    textappend(payload) <- ']}]'

    if(any(!is.na(x_axis))){

        textappend(payload) <- ","
        textappend(payload) <- jsonlite::toJSON(x_axis, auto_unbox = TRUE)

    }

    if(any(!is.na(y_axis))){

        textappend(payload) <- ","
        textappend(payload) <- jsonlite::toJSON(y_axis, auto_unbox = TRUE)

    }



    # finish construction
    textappend(payload) <- '}'

    return(payload)

}
Run Code Online (Sandbox Code Playgroud)

返回,例如:

cat(get_barchart_json(data = c(1,2,3,4), x_axis = list(labels = c("a", "b", "c", "d"), format = "text"), y_axis = list(format = 'decimal')))
Run Code Online (Sandbox Code Playgroud)

NB:textappend是:

`textappend<-` <- function(payload, value){
 payload <- paste0(payload, value)    
 payload
}
Run Code Online (Sandbox Code Playgroud)

Bad*_*Zen 6

NA用于数据集中缺失的数据值.它也会在NULL不会传播的地方传播,因为它可以是类型强制的.对于/ optional/value,请使用NULL.

我觉得这是一种允许缺少参数值的反模式 - 很难知道你遗漏了哪些值.对于NULL,第三个参数始终是第三个参数,等等...

请参阅NA与NULL.

  • "很难知道你遗漏了哪些值":这就是为什么函数调用中的命名参数是一件好事! (2认同)

Ric*_*ton 5

实际上,你有3种选择:NANULL,或者没有默认值。在大多数情况下,NULL是最好的选择。

function(x, optional_arg = NULL)
{
  if(is.null(optional_arg))
  {
    # do something
  }
  # rest of body code
}
Run Code Online (Sandbox Code Playgroud)

如果您希望用户能够将NULL合法值传递给optional_arg. 在这种情况下,请使用

function(x, optional_arg)
{
  if(missing(optional_arg))
  {
    # do something
  }
  # rest of body code
}
Run Code Online (Sandbox Code Playgroud)

默认值NA仅适用于可选 arg 应采用三个值之一的情况,将其存储为逻辑值而不是字符串更有意义。

function(x, optional_arg = NA)
{
  if(is.na(optional_arg))
  {
    # do something
  } else if(optional_arg)
  {
    # do something else
  } else  # case of optional_arg == FALSE
  {
    # do a third thing
  }
  # rest of body code
}
Run Code Online (Sandbox Code Playgroud)

  • 当您使用深度嵌套的函数并且想要在更高级别控制某些元素时,缺失开始变得很烦人,将其设置为 NULL 比编写代码以根据提供了更高的参数。 (2认同)