base R — 如何检测 var-args (...) 是否分配了键名(命名参数)?

base R — how to detect if var-args (...) had key names (named parameters) assigned?

我想检测某个函数 blah(...) 的给定 var-args (...) 是否具有调用者分配的键(命名参数):

blah = function(...) {
   # detect if key-names were given to ‘...’
   args = list(...)  #  seems to always have:  length(names(args)) == 2
}

# example calls:
blah(key1=someList1, userAssignedKeyName=someList2)
blah(someList1,someList2)   
  1. length(names(list(...))) == 0 似乎不可能——R 似乎默认使用某种内部 toString() 表示来表示键的名称;即,length(names(...)) == 2 总是.

  2. 我无法将函数 blah(...) 声明为 blah(key1=“”, key2=“”) 然后 detect by equality with “” 因为:

    我。这会丢失可变参数 属性

在 base-R 中,如何检测用户是否已将键名(命名其参数)传递给上面的 ...

(对我来说这似乎是不可能的,因为 R 语言规范似乎不假定命名参数的顺序保证;而且参数的命名是由编码器而不是调用者完成的;并且没有这样的支持...的语法)。

谢谢!

编辑:我认为像 Python 这样的 kwargs 命名列表是可行的方法吗?所以我会删除“...”并使用像 Python.

中的 kwargs 这样的命名列表

我不确定我是否理解你的意思。如果你想知道用户是否使用参数名称调用函数,你可以这样做:

blah <- function(...) names(list(...))

因此,在您的 set-up 中我们可能有:

someList1 <- list(a = "foo")
someList2 <- list(a = "bar")

blah(key1 = someList1, userAssignedKeyName = someList2)
#> [1] "key1"                "userAssignedKeyName"

blah(someList1, someList2) 
#> NULL

与你的问题所暗示的相反,如果我们有:

blah <- function(...) length(names(list(...)))

然后我们得到:

blah(key1 = someList1, userAssignedKeyName = someList2)
#> [1] 2

blah(someList1, someList2) 
#> [1] 0

还是我误会你了?

我不确定我是否正确理解了你的问题。这是你想要的吗?

blah <- function(...) {
    sum(names(list(...)) != "")
}

blah()
# [1] 0
blah(a = 2, b = 3)
# [1] 2
blah(2, a = 3)
# [1] 1

这个函数只计算命名参数,因为:

The name "" is special: it is used to indicate that there is no name associated with an element of a (atomic or generic) vector. (see ?names)