如何通过" ..."传递一些(但不是全部)进一步的参数

时间:2014-05-25 14:04:09

标签: r

我正在使用的其中一个函数调用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"

2 个答案:

答案 0 :(得分:4)

您可以将Currydo.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)
}