2017-04-17 10 views
0

R 패키지의 경우 for 루프에서 많은 함수를 프로그래밍 방식으로 정의하고 싶습니다. 예를 들어 NA 값을 항상 무시하는 기본 함수의 새 버전을 만드는 것과 같은 작업을 수행하려고 할 수 있습니다. 마찬가지로 :roxygen @export functionsin 루프

for(f in c('mean', 'sd', 'median', 'quantile', 'max', 'min', 'range')) { 
    cur = function() {} 
    formals(cur) = formals(args(get(f))) 
    body(cur) = parse(text = paste0(f, 
           '(', 
           names(formals(cur))[1], 
           ', na.rm = TRUE)')) 
    assign(paste0(f, 'x'), cur) 
} 

이 코드 생성의 새로운 7 개 가지 기능 (meanx, SDX, medianx, quantilex 등) 단순히 (등 SD, 중앙값, 분위수, 평균) 자신의 시조 기능 통화와 na.rm = 참된.

내 문제는 이것입니다 : 어떻게 roxygen을 사용하여이 7 가지 기능을 문서화 할 수 있습니까? 적어도, 나는 그들을 내보 내기를 원하지만, 만약 내가 #' @export 라인을 루프에 넣으면, roxygen은 그것으로 아무것도하지 않는다. 분명히, NAMESPACE 파일에 직접 이름을 쓸 수는 있지만, 만약 내가 roxygen을 다시 사용하면 변경 사항을 덮어 씁니다.

아이디어가 있으십니까?

(이 함수는 실제로 정의하는 함수가 아니므로 na.rm이나 다른 것을 자동으로 사용하는 방법에 대한 조언은 찾고 있지 않습니다. 루프 옥션 내보내기 함수를 NAMESPACE 파일에 루프로 정의하는 방법에 대한 아이디어에 관심이 있습니다.

+0

아직 답변이 없지만 설명서 패키지가이를 완화하는 데 도움이됩니다. R Documentation Task Force의 작업이며 동적으로 생성 된 함수를 쉽게 내보낼 수 있습니다. R Users Conference에서 2017 년 7 월까지 준비가 완료되어야합니다. –

+0

감사합니다. @Andrew, 패키지를 확인하기를 기대합니다! – user3474009

답변

0

이것이 원하는 경우 루프를 쉽게 사용할 수 있다고 생각하지 않습니다. 함수와 roxygen 코드를 작성하는 빌드 스크립트에서 루프를 사용하지 않는 한. 이 기능을 사용하면 수동으로 각 기능을 수행하면 많은 코드 복제가 가능합니다. 그래서 당신이 할 수있는 일은 함수를 입력으로 받아들이고 출력으로 함수를 반환하는 함수를 만드는 것입니다. 더 배우고 싶다면 여기에 관심이있는 검색어는 "클로저"입니다.

wrap_hmisc <- function(fun) { 

    function(x, ...) { 
    if (!requireNamespace("Hmisc", quietly = TRUE)) 
     stop("Hmisc package required for this function", call. = FALSE) 

    fun <- getExportedValue("Hmisc", fun) 
    result <- do.call(fun, list(x = quote(x), ...)) 

    plyr::rename(
     data.frame(t(result)), 
     c(Median = "y", Mean = "y", Lower = "ymin", Upper = "ymax"), 
     warn_missing = FALSE 
    ) 
    } 
} 
#' @export 
#' @rdname hmisc 
mean_cl_boot <- wrap_hmisc("smean.cl.boot") 
#' @export 
#' @rdname hmisc 
mean_cl_normal <- wrap_hmisc("smean.cl.normal") 
#' @export 
#' @rdname hmisc 
mean_sdl <- wrap_hmisc("smean.sdl") 
#' @export 
#' @rdname hmisc 
median_hilow <- wrap_hmisc("smedian.hilow") 

은 기본적으로 당신이 함수를 반환하는 함수를 만든 다음 수동을 통해 수정하려는 모든 기능을 갈 것을 사용할 수 있으며 관련 추가 : 여기에 ggplot2 codebase (GPL-2)의 예입니다 roxygen 문서화. 수동 스크립트 작성과 수동 roxygen 문서 작성을 할 수있는 방법이 없다.

+0

감사합니다. @Dason. 나는 실제로 당신의 솔루션과 비슷한 것을 (클로저와 함께) 이미 해왔지만, 당신의 버전은 좀 더 깔끔하다. 감사! 나는 정말로 # '\ @export를 반복해서 쓰지 않기를 바랬다. 그러나 주위에 아무런 방법이없는 것처럼 보인다. (아직 roxygen을 사용하면서). – user3474009

0

나는 내 자신의 문제에 대한 해결책을 찾았다 고 생각합니다! 나는 질문을 게시하기 전에 좀 더 철저하게 roxygen 문서를 조사 했어야했다.

그것은 당신이 공백으로 구분하여 하나의 #' @export 명령 여러 이름 급지 할 수 있습니다 밝혀 .. #' @export func1 func2 func3

그래서 내 원래의 문제는 너무로 해결할 수 있습니다

for(f in c('mean', 'sd', 'median', 'quantile', 'max', 'min', 'range')) { 
cur = function() {} 
formals(cur) = formals(args(get(f))) 
body(cur) = parse(text = paste0(f, 
           '(', 
           names(formals(cur))[1], 
           ', na.rm = TRUE)')) 
assign(paste0(f, 'x'), cur) 
} 
#' @export meanx sdx medianx quantilex maxx minx rangex 
NULL 

(난 꽤 #' @export 줄 뒤에 NULL이 있어야합니다.)

유일한 문제는 Rstudio에서 패키지를 빌드 할 때 존재하지 않는 것들이 내 보내지는 것으로 생각되므로 경고를 표시합니다 . 내 패키지를로드하는 사용자에게이 경고가 표시되는지 아직 알 수 없습니다.