我正在使用的其中一个函数调用grep()
并使用value = TRUE
进行硬编码。我想通过value
将所有其他参数除 grep()
传递给...
。下面的两个功能是我到目前为止所做的测试,两个都没有完成任务。
使用 ...
时排除一个或多个其他参数的最佳方法是什么?
练习功能1:
f <- function(pattern, x, ...)
{
dots <- list(...)
if('value' %in% names(dots))
dots <- dots[!grepl('value', names(dots))]
grep(pattern, x, value = TRUE, ...)
}
XX <- c('bct', 'abc', 'fds', 'ddabcff', 'jkl')
## test f()
f('abc', XX, value = TRUE) ## to test the error if user enters 'value' argument
# Error in grep(pattern, x, value = TRUE, ...) :
# formal argument "value" matched by multiple actual arguments
f('abc', XX, invert = TRUE)
# [1] "bct" "fds" "jkl"
f('ABC', XX, ignore.case = TRUE)
# [1] "abc" "ddabcff"
练习功能2:
h <- function(pattern, x, ...) x[grep(pattern, x, ...)]
## test h()
h('abc', XX, value = TRUE)
# [1] NA NA
h('abc', XX, invert = TRUE)
# [1] "bct" "fds" "jkl"
h('ABC', XX, ignore.case = TRUE)
# [1] "abc" "ddabcff"
答案 0 :(得分:4)
您可以将Curry
与do.call
合并:
require(functional)
f <- function(pattern, x, ...)
{
dots <- list(...)
dots <- dots[!grepl('value', names(dots))]
do.call(Curry(grep, pattern=pattern, x=x, value=TRUE), dots)
}
Curry
提供已知参数,dots
提供除&#34; value&#34;以外的所有内容。在...
。
答案 1 :(得分:2)
一种方法是只使值成为命名参数但忽略输入 - 这样它就不会成为点开头的一部分。
f <- function(pattern, x, value = "hahaThisGetsIgnored", ...){
grep(pattern, x, value = TRUE, ...)
}
您也可以在@MatthewLundberg给出的答案中使用这个想法,但是在没有Curry的情况下进行参数操作,这样您就不需要功能包了
f <- function(pattern, x, ...){
dots <- list(...)
# Remove value from the dots list if it is there
dots$value <- NULL
args <- c(list(pattern = pattern, x = x, value = TRUE), dots)
do.call(grep, args)
}