我正在编写一个接受可变数量参数的函数。此外,我希望用户能够将其中一些参数保留为缺失。
只考虑转动的任务...
到参数列表中。这是我的第一次尝试:
f <- function(...) list(...)
这失败了:
f(1,,2)
## Error in f(1, , 2) : argument is missing, with no default
我希望结果是list(1, NULL, 2)
。 (我不担心区分f(1,,2)
from f(1,NULL,2)
.)
这是我的第二次尝试:
g <- function(...)
{
args <- match.call()
miss <- vapply(args, identical, NA, quote(expr=))
args[miss] <- list(NULL)
args[[1L]] <- quote(list)
eval.parent(args)
}
这有效(有点):
identical(g(1,,2), list(1, NULL, 2))
## [1] TRUE
但是,转发点时失败:
gg <- function(...) g(...)
identical(gg(1,,2), list(1,NULL,2))
## [1] FALSE
有没有办法达到与g
,但是以允许转发点并且不使用match.call()
?
编辑:转发点的问题。
尝试以下操作很诱人:
h <- function(...)
{
args <- substitute(list(...))
miss <- vapply(args, identical, NA, quote(expr=))
args[miss] <- list(NULL)
eval.parent(args)
}
但是,正如 @lionel 指出的,如果您尝试转发,将会出现问题...
来自另一个函数:
hh <- function(...) h(letters, ...)
local({ a <- "foo"; h(a) })
## Error in eval(expr, p) : object 'a' not found
看来你要么需要expand.dots
的功能match.call
,或者你需要使用一个quosure(来自rlang包裹)。