我想收集函数中附加参数的名称(省略号/三个点)。
以下示例按预期工作
CollectDots <- function(...) {
as.character(rlang::ensyms(...))
}
CollectDots(A, B, C)
# "A" "B" "C"
但是,如果函数包含一个或多个参数(带/不带默认值),则输出不符合预期。
CollectDots1 <- function(Var1 = NA, ...) {
as.character(rlang::ensyms(...))
}
CollectDots1(A, B, C) # 1 explicit parameter, returning only B and C
# "B" "C"
CollectDots2 <- function(Var1 = NA, Var2, ...) {
as.character(rlang::ensyms(...))
}
CollectDots2(A, B, C) # 2 explicit parameters, returning C
# "C"
此外,如果
var1 = 10
,为什么下面的函数不打印 10 并抛出错误
CollectDots3 <- function(Var1 = 10, Var2, ...) {
print(Var1)
as.character(rlang::ensyms(...))
}
CollectDots3(A, B, C)
# Error: object 'A' not found
如何仅收集提供给函数的附加参数的名称(...),不包括函数中明确提到的参数?
当您定义一个函数时,例如:
function(Var1 = NA, ...)
,您是说该函数采用一个命名参数 Var1
,如果该参数不存在任何内容(命名为 或位于该位置),请使用 NA
。在 CollectDots1()
函数中,您只能得到“B”和“C”,因为它假定您要指定 Var1=A
。如果你把点放在命名参数之前,你就会得到你所期望的。
CollectDots1 <- function(..., Var1 = NA) {
as.character(rlang::ensyms(...))
}
CollectDots1(A, B, C)
#> [1] "A" "B" "C"
在下面的
CollectDots3()
中,该函数假定您指定 Var1=A
和 Var2=B
。由于您随后尝试在未定义 A
的情况下打印 A
,因此会生成错误。
CollectDots3 <- function(Var1 = 10, Var2, ...) {
print(Var1)
as.character(rlang::ensyms(...))
}
CollectDots3(A, B, C)
再次强调,将三个点放在前面将会给您带来您所期望的结果:
CollectDots3 <- function(..., Var1 = 10, Var2) {
print(Var1)
as.character(rlang::ensyms(...))
}
CollectDots3(A, B, C)
#> [1] 10
#> [1] "A" "B" "C"