2014-05-25 46 views
4

我的進行中函數之一調用grep()value = TRUE硬編碼。我想通過所有的進一步論證除了valuegrep()...。以下兩個函數是我迄今爲止所做的測試,但都沒有完成任務。如何通過「...」傳遞一些(但不是全部)更多參數

使用時排除一個或多個更多參數的最佳方法是什麼...

實踐功能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

是否與包括價值是一個問題一個命名參數? – Dason

+0

是的,它必須設置爲TRUE。我將從我正在編寫的函數發佈片段。 –

+2

解決方法是將'f'中的最後一行更改爲'do.call(「grep」,c(list(pattern = pattern),list(x = x),value = TRUE,dots))'where在「點」中,你排除了「價值」的論點。 –

回答

2

一種方法是僅將值設爲命名參數,但忽略輸入 - 這樣它就永遠不會成爲開始點的一部分。

f <- function(pattern, x, value = "hahaThisGetsIgnored", ...){ 
    grep(pattern, x, value = TRUE, ...) 
} 

您還可以使用在@MatthewLundberg給出了答案,但這樣做沒有咖喱參數操縱的想法,所以你並不需要的功能包

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) 
} 
+1

或者即使只是'dots $ value < - NULL'也可以用來消除它是否存在。 – MrFlick

4

您可以do.call結合Curry

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...中提供「價值」以外的其他商品。