我有一个函数,如果一个非空值提供给另一个可选参数,它会做额外的事情.如果未提供参数,则该函数不会执行任何额外操作.
使用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)
实际上,你有3种选择:NA,NULL,或者没有默认值。在大多数情况下,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)