捕获函数内的省略号/三个点;忽略明确提到的论点

问题描述 投票:0回答:1

我想收集函数中附加参数的名称(省略号/三个点)。

以下示例按预期工作

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

如何仅收集提供给函数的附加参数的名称(...),不包括函数中明确提到的参数?

r rlang
1个回答
0
投票

当您定义一个函数时,例如:

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"
© www.soinside.com 2019 - 2024. All rights reserved.