2013-06-30 2 views
7

일부 기본 인수를 바꾸는 래퍼 함수를 ​​만들고 싶습니다. 이제R : 줄임표 인수 사용 (...)

Error in localWindow(xlim, ylim, log, asp, ...) : 
    formal argument "cex" matched by multiple actual arguments 

컨텍스트의 비트 : 여기

문제의 핵심은 내가 함께 사투를 벌인거야.

myplot <- function(x, ...) { 
    plot(x, cex= 1.5, ...) 
} 

내가 위의 오류를 얻을 것이다 myplot(1:10, cex= 2)를 호출하는 경우 :이 같은 음모에 대한 래퍼 함수를 ​​정의하자. 나는 목록

l <- list(...) 

...을 설정할 수 있습니다 알고 나는 그러나

if(is.null(l[["cex"]])) l[["cex"]] <- 2 

을 할 수있는, 내가 어떻게 다시 줄임표 인수에이 목록을 "삽입"할 수 있습니까? (I이 작동하지 않습니다 알고) 식으로 뭔가 :

... <- l 

편집 : 나는 (@Thomas에서이 질문에 대해 제안) myplot 정의에 기본값을 사용할 수 있습니다,하지만 난하지 않으려 : 함수 인터페이스 뒤죽박죽이 될 것이다. 내가 도우미 함수처럼 정의 할 수 있습니다 같아요

.myfunchelper <- function(x, cex= 2.0, ...) { 
    plot(x, cex= cex, ...) 
} 

myfunc <- function(x, ...) { 
    .myfunchelper(x, ...) 
} 

그러나 (내가) 덜 우아 및 (ii) 내 호기심을 만족하지 않습니다.

답변

11

실제 답 :

당신은 속임수의 비트를 통해이 작업을 수행 할 수 있습니다. 먼저 함수를 이전처럼 정의하지만 함수 내부에 기본 인수가 포함 된 목록을 포함하십시오. 그런 다음 어떤 인수가 들어 왔는지를 ...을 통해 목록으로 분석하고 기본값을 ...의 기본값으로 바꾸고 업데이트 된 인수 목록을 do.call으로 전달합니다.

myplot <- function(x, ...) { 
    args1 <- list(cex=4, main="Default Title") # specify defaults here 
    inargs <- list(...) 
    args1[names(inargs)] <- inargs 
    do.call(plot, c(list(x=x), args1)) 
} 

myplot(x=1:3) # call with default arguments 
myplot(x=1:3, cex=2, main="Replacement", xlab="Test xlab") # call with optional arguments 

이전 특기 :

문제는 여기에 몇 가지 예를 들어 함수를 통해 볼 수있다 :

myplot1 <- function(x, ...) { 
    plot(x, cex= 1.5, ...) 
} 

myplot2 <- function(x, cex=3, ...) { 
    plot(x, cex=cex, ...) 
} 

myplot3 <- function(x, ...) { 
    plot(x, ...) 
} 

myplot1(1:3, cex=3) # spits your error 
myplot2(1:3, cex=3) # works fine 
myplot3(1:3, cex=3) # works fine 

myplot2에서, 당신은 cex의 디폴트 값을 지정하고 변경할 수 있습니다. myplot3에는 cex이 단순히 전달됩니다. 두 cex 인수 myplot2를 실행하면, 당신은 당신의 기능 (myplot1)에 무슨 일이 일어나고 있는지 볼 수 있습니다 :

myplot2(1:3, cex=3, cex=1.5) # same error as above 

그래서, 당신은 그럼 당신은 아무것도를 전달할 수 plot()의 모든 기본값을 설정하지 않도록하는 것이 가장 것 ...myplot에 입력하십시오.

+0

네,하지만 이것은 제가 피하고 싶습니다. 실제 문제는 복잡하며 함수 호출 정의에 기본값을 넣고 싶지 않습니다. 이미 너무 많은 인수가 있습니다. – January

+0

다음 답변의 내용을 기반으로 업데이트했습니다. http://stackoverflow.com/questions/7028385/can-i-remove-an-element-in-dot-dot-dot-and-pass-it-on/7028786# 7028786 – Thomas