2014-12-17 1 views
3

missing() 함수를 호출하지 않고 변수가 함수 내에 없는지 감지하고 싶습니다. 두 가지 대안을 찾았지만 둘 다 원유처럼 보입니다.함수 내 누락() 대신

대안 1

이없는 변수가 environmnent 클래스 "이름"을 것 같다하지만이 구조를 사용하는 직관적으로 잘못된 것 같다

a <- function(a, b){ 
    e <- environment() 
    if(class(e[["b"]]) == "name") 
    e$b <- a 

    print(b) 
} 

대안을 2

가능한 해결책은 parseeval을 사용하는 것이지만 이전 솔루션과 마찬가지로 원유처럼 보일 수 있습니다 :

,210
a <- function(a, b){ 
    e <- environment() 
    if(eval(parse(text = sprintf("missing(%s)", "b")))) 
    e$b <- a 

    print(b) 
} 

배경

내가 API를 변경 그리고 난이 ... 내의 모든 기존 인수 이름을 통해 루프에 좋아하고 사용자가 새 매개 변수 이름으로 업데이트해야한다는 경고를 보낼 것 같은

나는이 필요 . 이 missing()가 작동하지 않는 이유는, 내 현재 설정은 다음과 같습니다

# Warnings due to interface changes in 1.0 
API_changes <- 
    c(rowname = "rnames", 
    headings = "header", 
    halign = "align.header") 
dots <- list(...) 
fenv <- environment() 
for (i in 1:length(API_changes)){ 
    old_name <- names(API_changes)[i] 
    new_name <- API_changes[i] 
    if (old_name %in% names(dots)){ 
    if (class(fenv[[new_name]]) == "name"){ 
     fenv[[new_name]] <- dots[[old_name]] 
     dots[[old_name]] <- NULL 
     warning("Deprecated: '", old_name, "'", 
       " argument is now '", new_name ,"'", 
       " as of ver. 1.0") 
    }else{ 
     stop("You have set both the old parameter name: '", old_name, "'", 
      " and the new parameter name: '", new_name, "'.") 
    } 
    } 
} 
+0

이것들이 있어야합니까? 'myfun <- function (rnames = rowname, rowname) {if (! missing (rowname)) .Deprecated ("rnames", old = "rowname"); ...} ' –

+0

마크 다운 문서에서이 함수가 사용 되었기 때문에, 여러 번 나는 오래된 인수를 잠시 동안 유지하고 싶습니다. 다른 이유가 없다면, 내가 다시 제작해야하는 많은 문서가 있습니다. –

+0

하지만'rowname'은이 코드를 사용하여 여전히 작동합니다. –

답변

0

아이쿠, - 우리가 정말 eval(parse())에 관한 적절한 fortune 항목을 가리 키도록해야합니까? 어쨌든 dots<-list(...)의 내용을 반복하면 무엇이 문제입니까? 그것은 어떤 방법으로도 시간 돼지가 아닙니다.

는하지만 내 기본적인 응답은 : 당신이 ... 항목 내에서 유효하거나 유효하지 않은 인수를 허용하여 실수를했습니다. 그런 식으로 이전 함수를 설정 한 이유는 모르겠지만 장기적으로는 업데이트 된 릴리스에서이 구문을 제거하는 것이 훨씬 깔끔하고 안전합니다. 기능 & 패키지에는 도움말 페이지가 제공됩니다. 이전 버전과의 호환성을 인정하는 것만큼이나, 나는 당신이 여기있는 사람을 부끄럽게 생각한다고 생각하지 않습니다. 또한, 필요한 인수가 ...을 통해 전달되기를 원하는 방법 또는 이유가 확실하지 않습니다. 그리고 그것이 필요하지 않다면, 당신은 처음에 missing을 에뮬레이션하고 싶지 않습니다.

귀하의 사용자는 매우 신속하게 :-) 그들이 잘못된 인수 이름을 가지고 있다는 것을 깨닫게 될 것입니다. 이 과도기적 경고 메시지를 제공하는지 여부에 관계없이 사용자는 코드에서 다른 옵션으로 적응하거나 이관합니다.

+0

답변 해 주셔서 감사합니다. 나는 부드러운 전환을 원하고 동시에 많은 수의 오래된 매개 변수를 문서에서 사용하지 않아야합니다. 나는 다른 이유들 때문에'...'을 가지고 있으며 나는 전환기 동안 그것을 사용할 것이라고 생각했다.주목할 것입니다. 현재 해결책은 시간 돼지가 아닙니다. class (e [[n]] == "name"이 평가되지 않은 매개 변수 인 환경 변수를 식별하는 올바른 방법 인 경우 대부분 궁금합니다. –