대형 R 프로그램을 어떻게 구성합니까?
제가 복잡한 R 프로젝트를 수행할 때, 제 스크립트는 빠르게 길어지고 혼란스러워집니다.
코드를 항상 즐겁게 작업할 수 있도록 적용할 수 있는 방법은 무엇입니까?저는 이런 생각을 하고 있습니다
- 소스 파일에 함수 배치
- 무언가를 다른 소스 파일로 분류하는 경우
- 마스터 파일에 포함되어야 하는 항목
- 기능을 조직 단위로 사용(R이 글로벌 상태에 접근하기 어렵게 만든다는 점에서 이것이 가치가 있는지 여부)
- 들여쓰기/줄 바꿈 관행.
- 취급({?
- )}와 같은 것들을 1줄 또는 2줄에 놓을까요?
기본적으로 큰 R 스크립트를 구성하기 위한 경험칙은 무엇입니까?
일반적인 대답은 패키지를 사용하는 것입니다. 웹의 다양한 자습서와 R 확장자 쓰기 매뉴얼을 참조하십시오.
그것은 당신을 줍니다.
- 주제별로 코드를 구성하는 준자동 방법
- 인터페이스에 대해 생각해 볼 수 있도록 도움말 파일을 작성할 것을 강력히 권장합니다.
- 을 통한 많은 제정신 체크
R CMD check
- 회귀 검정을 추가할 수 있는 기회
- 이름 공간을 위한 수단뿐만 아니라.
막달는중리를 실행하는 입니다.source()
코드 오버는 정말 짧은 스니펫에 대해 작동합니다.내부 리포지토리에 대한 내부 패키지를 작성할 수 있으므로 게시할 계획이 없는 경우에도 다른 모든 내용은 패키지에 있어야 합니다.
'편집 방법' 부분에 대해서는, R Internals 매뉴얼은 섹션 6의 R 코딩 표준이 우수합니다.그렇지 않으면 Emacs의 ESS 모드에서 기본값을 사용하는 경향이 있습니다.
2008년 8월 13일 업데이트: David Smith는 방금 Google R 스타일 가이드에 대해 블로그에 올렸습니다.
저는 그들만의 파일에 다른 기능을 넣는 것을 좋아합니다.
하지만 저는 R의 패키지 시스템이 마음에 들지 않습니다.그것은 사용하기가 좀 어렵습니다.
저는 파일의 기능을 환경(다른 모든 언어에서 "이름 공간"이라고 부르는 것) 안에 배치하고 첨부하는 가벼운 대안을 선호합니다.예를 들어, 저는 다음과 같은 '유틸' 함수 그룹을 만들었습니다.
util = new.env()
util$bgrep = function [...]
util$timeit = function [...]
while("util" %in% search())
detach("util")
attach(util)
이것은 모두 파일 유틸리티에 있습니다.R. 소스를 제공하면 환경이 '유틸'로 전환되어 전화로 문의할 수 있습니다.util$bgrep()
더 , 등등만더나서가아하지,서하나가▁and아더;,attach()
콜은 그것을 매우 정당하게 만듭니다.bgrep()
직접적으로 그런 작업을 합니다.만약 이 그 환경에 그들은 입니다.ls()
가 표시됩니다.
저는 모든 파일이 모듈인 파이썬의 시스템을 시뮬레이션하려고 했습니다.그것이 있으면 더 좋겠지만, 이것은 괜찮아 보입니다.
특히 프로그래머라면 좀 당연하게 들릴지 모르지만, 제가 코드의 논리적이고 물리적인 단위에 대해 생각하는 방법은 다음과 같습니다.
이것이 당신의 경우인지는 모르겠지만, 제가 R에서 일할 때, 저는 큰 복잡한 프로그램을 염두에 두고 시작하는 경우가 거의 없습니다.저는 보통 하나의 스크립트에서 시작하여 코드를 논리적으로 분리할 수 있는 단위로 분리합니다. 종종 함수를 사용합니다.데이터 조작 및 시각화 코드는 자체 기능 등에 배치됩니다.이러한 기능은 파일의 한 섹션(맨 위에 있는 데이터 조작, 시각화 등)에 함께 그룹화됩니다.궁극적으로 스크립트를 쉽게 유지하고 결함률을 낮추는 방법에 대해 생각해야 합니다.
당신이 당신의 기능을 얼마나 미세하게/조잡하게 만드는지는 다양하고 다양한 경험칙이 있습니다. 예를 들어, 15줄의 코드나 "기능은 이름으로 식별되는 하나의 작업을 수행할 책임이 있어야 합니다." 등이 있습니다.마일리지는 다양합니다.R은 참조 호출을 지원하지 않기 때문에, 저는 보통 데이터 프레임이나 유사한 구조를 전달하는 것과 관련이 있을 때 제 기능을 너무 세밀하게 만드는 것에 대해 다양합니다.하지만 이것은 제가 R과 처음 시작했을 때 일부 어리석은 수행 실수에 대한 과도한 보상일 수 있습니다.
논리 단위를 자체 물리적 단위(예: 소스 파일 및 패키지와 같은 더 큰 그룹)로 추출하는 시기는 언제입니까?두 가지 경우가 있습니다.첫째, 파일이 너무 커지고 논리적으로 관련이 없는 장치들 사이를 스크롤하는 것은 성가신 일입니다.둘째, 다른 프로그램에서 재사용할 수 있는 기능이 있다면,저는 보통 그룹화된 단위, 예를 들어 데이터 조작 기능을 별도의 파일에 넣는 것으로 시작합니다.그러면 다른 스크립트에서 이 파일을 원본으로 만들 수 있습니다.
기능을 배포하려면 패키지에 대한 생각을 시작해야 합니다.저는 다양한 이유로 생산이나 다른 사람들이 재사용할 수 있도록 R 코드를 배포하지 않습니다(간단히: 조직 문화는 다른 언어, 성능, GPL 등을 선호합니다).또한 소스 파일 컬렉션을 지속적으로 세분화하고 추가하는 경향이 있으며, 변경할 때 패키지를 처리하지 않는 편이 좋습니다.따라서 더크와 같은 다른 패키지 관련 답변을 확인하여 이 전면에 대한 자세한 내용을 확인해야 합니다.
마지막으로, 저는 당신의 질문이 반드시 R에게 특정한 것은 아니라고 생각합니다.저는 그러한 문제와 코딩 관행 전반에 대한 많은 지혜가 포함된 Steve McConnell의 Code Complete를 읽는 것을 정말 추천합니다.
나의 간결한 대답:
- 충분히 일반적인 출력과 입력을 식별하여 기능을 주의 깊게 작성합니다.
- 전역 변수의 사용을 제한합니다.
- S3 객체와 해당하는 경우 S4 객체를 사용합니다.
- 특히 기능이 C/Fortran을 호출할 때는 해당 기능을 패키지에 넣습니다.
저는 R이 생산에 점점 더 많이 사용되고 있기 때문에 재사용 가능한 코드에 대한 필요성이 이전보다 더 커졌다고 생각합니다.저는 통역사가 예전보다 훨씬 더 강하다는 것을 알게 되었습니다.R이 C보다 100-300배 느리다는 것은 의심의 여지가 없지만, 일반적으로 병목 현상은 C/C++에 위임될 수 있는 몇 줄의 코드에 집중됩니다.데이터 조작과 통계 분석에서 R의 강점을 다른 언어에 위임하는 것은 실수라고 생각합니다.이러한 경우 성능 저하가 적으며, 어떤 경우에도 개발 노력을 절감할 가치가 있습니다.실행 시간만 문제라면 우리 모두는 글쓰기 조립자가 될 것입니다.
패키지를 작성하는 방법을 알고 싶었지만 시간을 투자하지 않았습니다.각 미니 프로젝트에 대해 모든 하위 수준 함수를 'functions/'라는 폴더에 보관하고 이를 별도의 네임스페이스에 저장하여 명시적으로 만듭니다.
다음 줄의 코드는 "myfuncs"라는 이름의 환경이 아직 존재하지 않는 경우(첨부 파일 사용) 검색 경로에 생성되고 내 'funcs/' 디렉터리의 .r 파일에 포함된 함수로 채워집니다(sys 사용).출처).저는 보통 높은 수준의 함수(낮은 수준의 함수 호출)가 호출되는 "사용자 인터페이스"를 의미하는 주 스크립트의 맨 위에 이 행을 놓습니다.
if( length(grep("^myfuncs$",search()))==0 )
attach("myfuncs",pos=2)
for( f in list.files("functions","\\.r$",full=TRUE) )
sys.source(f,pos.to.env(grep("^myfuncs$",search())))
변경할 때 항상 동일한 줄로 다시 소스하거나 다음과 같은 것을 사용할 수 있습니다.
evalq(f <- function(x) x * 2, pos.to.env(grep("^myfuncs$",search())))
생성한 환경의 추가/수정 사항을 평가합니다.
제가 알기로는 그것은 무미건조하지만, 너무 격식을 차릴 필요는 없습니다. (하지만 제가 패키지 시스템을 장려할 기회가 있다면 - 바라건대 저는 미래에 그런 식으로 이주할 것입니다.)
코딩 규약에 대해서 말하자면, 미학과 관련하여 본 것은 이것뿐입니다(나는 그것들을 좋아하고 느슨하게 따르지만 R에서 너무 많은 곱슬곱슬한 교정기를 사용하지 않습니다).
http://www1.maths.lth.se/help/R/RCC/
useR! 컨퍼런스에서 다양한 프레젠테이션(일반적으로 기조연설)에서 제안된 [,drop=FALSE] 및 <- 할당 연산자의 사용과 관련하여 다른 "관습"이 있지만, [,drop=FALSE]는 여러분이 예상하는 입력이 확실하지 않은 프로그램에 유용하다고 생각합니다.
저를 패키지에 찬성하는 다른 사람으로 간주해 주세요.저는 제가 (출시되기 전까지) 맨 페이지와 비넷을 작성하는 것이 꽤 서툴다는 것을 인정하지만, 그것은 소스 do를 묶는 정말 편리한 방법을 만듭니다.게다가, 만약 당신이 당신의 코드를 유지하는 것에 대해 진지해진다면, 더크가 제기하는 요점들은 모두 플라이어에 포함됩니다.
저도 동의합니다.패키지를 사용합니다.시작하기 위한 스켈레톤 함수입니다.코드가 다시 실행되지 않을 수 있다고 생각하더라도 나중에 시간을 절약할 수 있는 더 일반적인 코드를 만들도록 동기를 부여하는 데 도움이 될 수 있습니다.
글로벌 환경에 액세스하는 것은 권장되지 않지만 <<- 연산자를 사용하면 쉽습니다.
아직 패키지 작성 방법을 배우지 못한 저는 항상 서브스크립트를 소싱하여 정리해 왔습니다.쓰기 수업과 비슷하지만 관련된 것은 아닙니다.그것은 프로그램적으로 우아하지는 않지만 시간이 지남에 따라 분석을 쌓는다는 것을 알게 되었습니다.큰 섹션이 작동하면 작업 공간 개체를 사용하기 때문에 다른 스크립트로 이동하고 소스만 생성하는 경우가 많습니다.아마도 여러 소스에서 데이터를 가져와 모든 데이터를 분류하고 교차로를 찾아야 할 것입니다.저는 그 부분을 추가 스크립트에 넣을 수도 있습니다.그러나 "응용프로그램"을 다른 사용자에게 배포하거나 일부 대화형 입력을 사용하는 경우 패키지가 좋은 경로일 수 있습니다.연구원으로서 분석 코드를 배포할 필요는 거의 없지만 종종 코드를 확대하거나 수정해야 합니다.
저는 또한 R 대형 프로젝트를 구성하기 위한 적절한 워크플로우의 성배를 찾고 있습니다.작년에, 저는 rsuite라는 소포를 발견했습니다. 그리고, 확실히, 그것은 제가 찾던 것이었습니다.이 R 패키지는 대형 R 프로젝트의 배포를 위해 명시적으로 개발되었지만, 저는 소형, 중형, 대형 R 프로젝트에 사용할 수 있다는 것을 알게 되었습니다.잠시 후(아래) 실제 사례에 대한 링크를 제공하겠지만, 먼저 R 프로젝트를 구축하는 새로운 패러다임을 설명하고자 합니다.rsuite
.
참고. 저는 개발자나 개발자가 아닙니다.rsuite
.
우리는 RStudio와 함께 모든 프로젝트를 잘못 수행해 왔습니다. 목표는 프로젝트나 패키지를 만드는 것이 아니라 더 큰 범위를 만드는 것이어야 합니다.따라서 가능한 모든 조합으로 표준 R 프로젝트와 R 패키지를 보관하는 슈퍼 프로젝트 또는 마스터 프로젝트를 생성할 수 있습니다.
R 슈퍼 프로젝트가 있음으로써 더 이상 유닉스가 필요하지 않습니다.
make
R 프로젝트의 하위 수준을 관리하기 위해 맨 위에 R 스크립트를 사용합니다.보여드릴게요.적합한 마스터 프로젝트를 생성하면 다음과 같은 폴더 구조를 얻을 수 있습니다.
폴더
R
대체할 프로젝트 관리 스크립트를 배치하는 위치입니다.make
.폴더
packages
의 폴더입니다.rsuite
슈퍼 프로젝트를 구성하는 모든 패키지를 포함합니다.인터넷에서 액세스할 수 없는 패키지를 복사하여 붙여넣을 수도 있으며, rsuite도 이 패키지를 빌드합니다.폴더
deployment
가 어디에 있습니까?rsuite
패키지에 표시된 모든 패키지 이진 파일을 씁니다.DESCRIPTION
파일들입니다. 그래서, 이것만으로도, 여러분은 시간이 지남에 따라 완전히 재현할 수 있습니다.rsuite
모든 운영 체제에 대한 클라이언트가 함께 제공됩니다.저는 그것들을 모두 테스트했습니다.그러나 설치할 수도 있습니다.addin
R 스튜디오용입니다.rsuite
또한 격리된 시스템을 구축할 수 있습니다.conda
자체 폴더에 설치conda
이것은 환경이 아니라 기계의 아나콘다에서 파생된 물리적 Python 설치입니다.의 R 은과함니다작합동께와 합니다.SystemRequirements
원하는 콘다 채널에서 원하는 모든 파이썬 패키지를 설치할 수 있습니다.또한 로컬 리포지토리를 생성하여 오프라인 상태일 때 또는 전체 패키지를 더 빨리 작성하고자 할 때 R 패키지를 가져올 수 있습니다.
원하는 경우 R 프로젝트를 zip 파일로 빌드하여 동료와 공유할 수도 있습니다.동료에게 동일한 R 버전이 설치되어 있으면 실행됩니다.
우분투, 데비안 센터OS에서 전체 프로젝트의 컨테이너를 구축하는 것입니다. 전체 파일을 합니다.
Docker
프로젝트를 실행할 준비가 된 컨테이너입니다.
저는 많은 실험을 해왔습니다.rsuite
완전한 재현성을 찾고 글로벌 환경에 설치하는 패키지에 의존하지 않도록 합니다.패키지 업데이트를 설치하는 즉시 프로젝트, 특히 특정 매개 변수가 있는 함수에 대한 특정 호출이 있는 패키지가 작동을 중지하는 경우가 많기 때문에 이는 잘못된 것입니다.
제가 처음으로 실험을 시작한 것은bookdown
ㅠㅠㅠㅠ 는 6개월에서 살아남기 이 좋았던 .저는 6개월 이상의 시간의 시험에서 살아남기 위해 책을 읽을 만큼 운이 좋았던 적이 없습니다.그래서, 제가 한 것은 원래의 북다운 프로젝트를 다음에 따르도록 변환한 것입니다.rsuite
뼈대이제 글로벌 R 환경 업데이트에 대해 걱정할 필요가 없습니다. 프로젝트에는 자체 패키지 세트가 있습니다.deployment
폴더를 누릅니다.
다음으로 제가 한 일은 기계 학습 프로젝트를 만드는 것이었지만,rsuite
way. 마스터, 맨 위에 있는 오케스트레이션 프로젝트 및 모든 하위 프로젝트 및 패키지가 마스터의 제어 하에 있습니다.그것은 당신이 R로 코딩하는 방식을 정말 변화시켜 당신을 더 생산적으로 만듭니다.
그 후에 저는 새로운 패키지에서 일하기 시작했습니다.rTorch
이것은 상당 부분 때문에 가능했습니다.rsuite
그것은 당신이 크게 생각하고 나아갈 수 있게 해줍니다.
하지만 한 가지 충고. »rsuite
쉽지 않습니다.R 프로젝트를 만드는 새로운 방법을 제시하기 때문에 어렵게 느껴집니다.첫 번째 시도에 당황하지 말고, 성공할 때까지 계속해서 비탈길을 오르세요.운영 체제와 파일 시스템에 대한 고급 지식이 필요합니다.
나는 언젠가 그것을 기대합니다.RStudio
다음과 같은 조정 프로젝트를 생성할 수 있습니다.rsuite
메뉴에서 수행합니다.정말 멋질 것 같아요.
링크:
R은 대화형 사용과 작은 스크립트에는 괜찮지만 큰 프로그램에는 사용하지 않을 것입니다.저는 대부분의 프로그래밍에 주류 언어를 사용하고 R 인터페이스로 포장할 것입니다.
언급URL : https://stackoverflow.com/questions/1266279/how-to-organize-large-r-programs
'source' 카테고리의 다른 글
그룹당 여러 변수(예: 합, 평균) 집계/요약 (0) | 2023.06.13 |
---|---|
Linux에서 pid_t, uid_t, gid_t의 크기 (0) | 2023.06.13 |
루비 전송 vs __send__ (0) | 2023.06.13 |
data.table이 다른 data.table에 대한 참조(복사본)일 때 정확하게 이해 (0) | 2023.06.13 |
Firebase Auth ID 토큰에 잘못된 "aud" 클레임이 있습니다. (0) | 2023.06.13 |