假设我有一个由26个参数组成的函数(全部都是可选的),这些参数必须默认为NULL
missingStuff <- function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o , p,
q, r, s, t, u, v, w, x, y, z) {
...
}
我可以像这样测试每个实例
,例如
。missingStuff <- function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o , p,
q, r, s, t, u, v, w, x, y, z) {
if(missing(a)) a <- NULL
if(missing(b)) b <- NULL
...
}
或者我可以将它们默认为NULL
missingStuff <- function (a = NULL, b = NULL, c = NULL, d = NULL, e = NULL,
f = NULL, g = NULL, h = NULL, i = NULL, j = NULL,
k = NULL, l = NULL, m = NULL, n = NULL, o = NULL,
p = NULL, q = NULL, r = NULL, s = NULL, t = NULL,
u = NULL, v = NULL, w = NULL, x = NULL, y = NULL,
z = NULL) {
...
}
但这两种选项都很繁琐且有些混乱。我真的找不到一个合适的方式来做这个。也许可以使用
formals()
来更实际地完成这个任务。这种方法不起作用,无论
if
语句如何,它都会将所有内容赋值为NULL
。missingStuff <- function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o , p,
q, r, s, t, u, v, w, x, y, z) {
lapply(formals(), function(x) {
if(missing(x)) x <- NULL
})
}
同样的,也不会
missingStuff <- function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o , p,
q, r, s, t, u, v, w, x, y, z) {
lapply(formals(), function(x) {
if(x == "") x <- NULL
})
}
尽管
formals(missingStuff)[1] == ""
a
TRUE
我错过了什么吗?
missing
,这可能会混淆名称和字符值等。虽然不太美观,但它可能适合你:for (x in setdiff(names(formals()), names(as.list(match.call()[-1])))) assign(x, value=NULL)
。 - lukeAformals
中清晰地默认为NULL,对其他用户来说更加明确。话虽如此,我难以想象有哪个函数需要26个输入参数。这就是...
的用途——可选参数,除非被调用,否则可以忽略。或者,考虑到参数太多,你也可以要求传递一个list
变量到你的函数中,并创建一个默认变量,其全部为 NULL。 - Carl Witthoft