R : 자체 작성된 패키지에서 magrittr 파이프 연산자 사용


101

데이터 변환 을 연결하기 위해 직접 작성한 패키지 %>%magrittr패키지에 도입 된 파이프 연산자를 사용하고 싶습니다 dplyr. 파일 에서와 magrittr같이 나열됩니다 . 내 패키지를로드하고 파이프 연산자를 사용하는 함수를 테스트 한 후 다음 오류 메시지가 표시됩니다.ImportDESCRIPTION

functionname (parameter, : 함수 "%> %"을 (를) 찾을 수 없습니다.

변경 %>%magrittr::%>%패키지가 더 이상 건설 할 수 없기 때문에 함수 소스 코드에서하는 것은 도움이되지 않습니다.


4
패키지 내부의 함수 내부의 파이프 연산자에 대해 조언 할 것입니다. 이는 디버깅을 훨씬 더 어렵게 만듭니다 (호출 스택은 파이프로 인해 엄청나게 깊어집니다). 패키지의 경우 임시 변수를 덮어 쓰면 테스트가 훨씬 쉬워집니다 (R에서 오류가 발생한 줄을 알려줍니다). 파이프는 대화 형 사용에는 좋지만 프로그래밍에는 부담이 될 수 있습니다.

답변:


101

magrittr나열된 경우 올바르게 작동 했어야합니다 Depends. 그러나 이것은 권장되지 않습니다 . 대신, 당신은 떠날 magrittr에서 Imports와에 다음 줄을 추가합니다 NAMESPACE:

importFrom(magrittr,"%>%")

Writing R extensions를 읽는 것이 좋습니다 . 귀하의 질문은 1.1.3 및 1.5.1 단락에서 다룹니다.


1
@alexanderketh이 경우 답변 옆의 녹색 체크 표시를 눌러 수락 한 것으로 표시해야합니다. SO에 오신 것을 환영합니다!
tonytonov

54
을 사용하는 경우을 roxygen2추가 #' importFrom magrittr "%>%"하여을하는 동안 NAMESPACE가 자동으로 채워지도록 할 수 있습니다 roxygenize().
Roman Luštrik

38
RomanLuštrik @, 그냥 실종 @이어야한다#' @importFrom magrittr "%>%"
Roah

13
이렇게하면 %>%패키지에서 내부적으로 만 사용할 수 있습니다 . API에서 사용자가를 사용하여 함수를 연결해야하는 경우 %>%에도 명시 적으로로드해야합니다 magrittr. 이 문제를 해결하는 한 가지 방법은 함수를 다시 내보내는 것입니다. 다음은이 를 수행하는 방법 의 예 입니다.
Ramnath 2015

이것은 또한
usethis

33

이제 패키지에서 파이프를 지원하는 더 쉬운 방법이 있습니다. 멋진 패키지 usethis에는 기능이 use_pipe()있습니다. 이 함수를 한 번 실행하면 모든 것을 처리합니다. 다음은 문서 use_pipe()에서 함수가 설명되는 방식입니다 usethis.

패키지 내부에서 magrittr의 파이프를 사용하고 패키지 사용자를 위해 다시 내보내는 데 필요한 설정이 있습니까?

DESCRIPTION의 "Imports"에 magrittr을 추가합니다.

필요한 roxygen 템플릿으로 R / utils-pipe.R을 생성합니다.


use_pipe()패키지를 빌드하는 데 사용하는 코드에 줄 을 추가 합니까? 예를 들어 다음을 실행 usethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path)합니다.. use_pipe()처음에 추가 할까요?
Josh

1
@Josh usethis는 패키지를 개발할 때 함수를 한 번 사용합니다 . 그런 다음 해당 함수는 빌드 지침 및 기타 모든 항목에 필요한 부분을 추가합니다.
Andrew Brēza

32

하나의 추가 솔루션- roxygen패키지를 사용하십시오 . devtools패키지의 일부로 구현됩니다 . 일단 devtools설치, 호출 devtools::document()하여 업데이트됩니다 NAMESPACE당신을 위해. 또한 문서와 함께 .Rd 파일을 자동 빌드하므로 편리합니다.

#' @import packagename파일에 형식의 특수 주석을 추가하여 해당 패키지에서 모든 함수 #' @importFrom packagename functionname를 가져 오거나 함수를 가져 오기만하면됩니다. 파일에 원하는만큼 이러한 주석을 포함 할 수 있으므로 각 파일의 맨 위에 또는 외부 기능이 필요한 각 함수에 주석 세트를 가질 수 있습니다.

그런 다음 실행 devtools::document()하고 코드를 구문 분석하여 해당 주석을 찾은 다음 적절한 NAMESPACE파일을 만듭니다 . 쉬운.


1
이렇게하면 R 스크립트의 첫 번째 기능에 대한 도움말 파일과 관련된 다음과 같은 산소 주석이 엉망이됩니다. 도움말 파일에서 전역 산소 주석을 어떻게 분리합니까?
jzadra

2
나는 일반적으로 각 기능에 대해 개별적으로 가져 오기 주석을 넣습니다. 이렇게하면 파일의 다른 기능이 변경 되어도 가져 오기가 정확하게 유지됩니다. 따라서 전역 정의가 없습니다.
Mike Stanley

18

RStudio, Hadley의 devtools패키지를 사용하고 magrittr있고 DESCRIPTION파일 의 Imports 섹션에 나열 되어 있다고 가정하면 다음은 %>%패키지 함수에서 작업 하기 위해 수행 한 단계 입니다.

먼저 함수를 작성하십시오 foo.R.

#' Convert \code{data.frame} to \code{list}.
#' 
#' @importFrom magrittr %>%
#' @name %>%
#' @rdname pipe
#' @export
#' @param x A \code{data.frame} object.
#' @examples
#' my_result <- foo(iris)
#'
foo <- function(x) {
    x %>%
        as.list()
}

둘째, devtools::document().

셋째, devtools::load_all().

이와 같은 파일 R/ 디렉토리에 생성되고 함수가 예상대로 작동합니다.


6
@name %>%여기서 의 목적은 무엇 입니까?
JelenaČuklina
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.