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)
length(names(list(...))) == 0
似乎不可能——R 似乎默认使用某种内部 toString() 表示来表示键的名称;即,length(names(...)) == 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
)
我想检测某个函数 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)
length(names(list(...))) == 0
似乎不可能——R 似乎默认使用某种内部 toString() 表示来表示键的名称;即,length(names(...)) == 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
)