2014-09-09 2 views
8

함수에 매개 변수 집합을 전달하려고합니다. 이 함수는 위의 매개 변수 집합에 속하는 두 가지 하위 함수를 포함합니다.부모 함수에서 "..."매개 변수를 두 자식 함수에 전달하는 방법

f_combined(xx = 2, yy = 2) 

다음 "단순화"예를 f_combined에서

... 내가 f_plusxxf_sqr에 전달되고 yy 통과되도록 다음과 같은 함수 호출을하고 싶습니다받는 함수입니다 하지만 그것은 내게 오류를 줄 것이다 :

Error in f_sqr(...) : unused argument (yy = 2) 

어떤 suggustion 에스?

f_sqr <- function(xx =1){ 
    xx^2 
} 

f_plus <- function(yy =1){ 
    yy + 1 
} 

f_combined <- function(...){ 
    f_sqr(...) + f_plus(...) 
} 
+2

당신이'...'사용하는 대신 결합 기능의 기본 인수를 넣을 수 없습니다 호출입니까? – nico

+0

아닙니다. 간단한 기능을 위해 네가 할 수 있습니다. 하지만 실제로 많은 기능을 여러 매개 변수와 결합하는 훨씬 더 복잡한 기능을 찾고 있습니다. ggplot()과 같은 함수를 생각해보십시오. – kindadolf

답변

9

의 다른 방법은 함수의 formals() 무엇을보고 쿼리 것으로 명명 된 페어 목록 또는 액세스를 같은 액세스 ... 명명 된 매개 변수는 기대하는 것이며 그것들만을 전달합니다. "자식"함수가 ...을 허용하면 모든 인수를 전달합니다. 이 메소드는 위치 인수에 적합하지 않습니다.

f_combined <- function(..., .fns =list(f_sqr, f_plus), .reduce=`+`){ 
    dots <- list(...) 
    Reduce(.reduce, lapply(.fns, function(f) { 
     if ("..." %in% names(formals(f))) { 
      do.call(f, dots) 
     } else if (any(names(dots) %in% names(formals(f)))) { 
      do.call(f, dots[names(formals(f))]) 
     } else { 
      f() 
     } 
    })) 
} 

여기에 내가 매개 변수 ( .fns=list(f_sqr, f_plus))로 실행하는 두 가지 기능을 설정 한 그래서 그들은 쉽게 변경할 수 있습니다 이상을 쉽게 추가 할 수 있습니다. 또한 합계 값 ( .reduce='+') 이외의 다른 값을 사용하려는 경우 해당 값을 결합하는 방법을 지정하는 매개 변수를 설정했습니다. 그러나 기본 아이디어는 명명 된 매개 변수의 최상위 집합을 찾고이를 전달하는 것입니다. "자식"함수는 매개 변수에 대한 기본값도 가지고 있으므로 매개 변수도 전달할 때 실행됩니다. 여기

몇 가지 예

f_combined() 
# [1] 3 
f_combined(xx=2) 
# [1] 6 
f_combined(yy=2) 
# [1] 4 
f_combined(xx = 2, yy = 2) 
# [1] 7 
+0

이 답변을 제공해 주셔서 감사합니다. 그것은 나를 위해 매우 유용했습니다. (f가 더 많은 인수를 가질 때 ...) do.call (f, dots [intersect (names (dots), names (formals (f))])' – jmones

13

중 하나를 수행 할 수 있습니다 위해 ..n

f_sqr <- function(xx =1){xx^2} 
f_plus <- function(yy =1){yy + 1} 

f_combined <- function(...){ 
    print(f_sqr(list(...)$xx)) 
    print(f_plus(list(...)$yy)) 
    print(f_sqr(..1)) 
    print(f_plus(..2)) 
} 
f_combined(yy = 1, xx = 10) 

[1] 100 (element with name xx of the list ...) 
[1] 2 (element with name yy of the list ...) 
[1] 1 (the first argument in the list ...) 
[1] 11 (the second argument in the list ...) 

출력 ?"..."

10.4 The ‘...’ argument

Another frequent requirement is to allow one function to pass on argument settings to another. For example many graphics functions use the function par() and functions like plot() allow the user to pass on graphical parameters to par() to control the graphical output. (See The par() function, for more details on the par() function.) This can be done by including an extra argument, literally ‘...’, of the function, which may then be passed on. An outline example is given below.

fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) { 
    [omitted statements] 
    if (graph) 
    par(pch="*", ...) 
    [more omissions] 
} 

Less frequently, a function will need to refer to components of ‘...’. The expression list(...) evaluates all such arguments and returns them in a named list, while ..1, ..2, etc. evaluate them one at a time, with ‘..n’ returning the n'th unmatched argument.

+2

두 인수 중 하나를 생략하면 실패합니다. 예를 들어'f_combined (yy = 1)'은 예상 한 결과를 제공하지 않습니다. – nico

+0

@nico OP가'... '을 어떻게 사용하는지 묻기 때문에, 그것을 사용하는 방법에 대한 나의 이해입니다. 그게 다야. MrFlick이 더 안정적인 솔루션을 찾은 것처럼 보입니다. –

+0

두 매개 변수를 모두 지정해야하고 기본값을 사용할 수없는 경우'... '를 사용하는 것이 무엇입니까? 솔직하게 말하면, 위에서 언급 한 것처럼'f_combined <- function (xx = 1, yy = 2)'와 디폴트가없는 두 개의 다른 함수를 갖는 것이 가장 쉬운 방법이라고 생각합니다. – nico

관련 문제