재현가능한 과학적 분석을 위한 R

RStudio와 함께하는 프로젝트 관리

학습 목표

  • RStudio에 완비된 프로젝트를 생성할 수 있다.
  • RStudio 내부에서 Git을 사용할 수 있다.

들어가며

과학적 과정은 본질적으로 증분이다. 프로젝트 대부분은 아무렇게 적은 노트필기, 일부 코드, 그리고 나서, 원고작성, 그리고 나면 종국에 모든 것이 함께 섞여진다.

대부분은 다음과 같이 프로젝트를 구조화하는 경향이 있다:

항상 이런 방식을 회피해야 되는 이유는 많다:

  1. 어느 데이터 버젼이 원본이고, 어느 데이터 버젼이 변경된 것인지 분간하기 정말 힘들다;
  2. 다양한 확장자를 갖는 파일과 뒤섞일 때, 정말 엉망이 된다;
  3. 아마도 실제 파일을 찾고, 해당 그래프를 생성하는데 사용된 정확한 프로그램 코드와 맞는 그림을 연결시키는데 시간이 엄청 많이 소요될 것이다.

프로젝트를 잘 배치하게 되면 궁극적으로 여러분의 삶을 편안하게 만들 것이다:

  • 데이터 정합성을 보장할 것이다;
  • 작성한 코드를 다른 사람(연구실 동료, 공동연구자, 지도교수)과 더 단순하게 공유할 수 있게 만든다;
  • 논문 제출할 때 코드를 쉽게 업로드할 수 있게 한다;
  • 휴가 뒤에, 프로젝트 백업을 더 손쉽게 한다.

가능한 해결책

다행스럽게도, 작업을 효과적으로 관리할 수 있게 도움이 되는 도구와 팩키지가 있다.

RStudio의 가장 강력하고 유용한 측면 중 하나가 프로젝트 관리 기능이다. 프로젝트 관리 기능을 사용해서, 모든 것이 갖춘 재현가능한 프로젝트를 생성한다.

도전과제: 모든 것을 갖춘 프로젝슽 생성하기

RStudio에서 새로운 프로젝트를 생성한다:

  1. “File” 메뉴를 클릭하고 나서, “New Project” 선택한다.
  2. “New Directory”를 클릭한다.
  3. “Empty Project”를 클릭한다.
  4. 프로젝트를 저장할 디렉토리 명칭을 타이핑한다. 예를 들어, “my_project”.
  5. “Create a git repository”에 대한 체크박스가 선택되었는지 확실히 한다.
  6. “Create Project” 버튼을 클릭한다.

이제 프로젝트 디렉토리에서 R을 시작하거나, RStudio로 해당 프로젝트를 열게 되면, 프로젝트에 모든 작업은 해당 디렉토리에 완전히 담겨진다.

프로젝트 구성을 위한 모범 활용사례

프로젝트를 구성하는 “가장 최선의” 방식이 없지만, 프로젝트 관리를 더 수월하게 하는데 준수해야 되는 일반적인 원칙이 몇가지 있다:

데이터를 읽기 전용으로 다룬다.

아마도 이것이 프로젝트 설정에 대한 가장 중요한 목적이다. 데이터는 일반적으로 수집하는데 시간이 많이 걸리고 비용이 많이 든다. (엑셀처럼) 인터랙티브하게 데이터를 작업하게 되면, 필연적으로 데이터에 변형이 일어나고 데이터 출처와, 수집이 이루어진 뒤에 어떻게 변형되었는지 확인을 할 수 없게 된다. 따라서, 데이터를 “읽기-전용(Read-Only)”으로 다룬다.

데이터 정제

많은 경우에, 데이터가 “지저분하다”: 상당한 전처리 과정을 거쳐야 R 형식(혹은 다른 프로그래밍 언어)으로 유용하게 사용될 수 있다. 이런 작업이 “데이터 정제작업”이라고 불린다. 1 별도 디렉토리에 데이터 정제 스크립트를 보관하고, “정제된” 데이터셋을 보관하는 두번째 “읽기-전용” 데이터 디렉토리를 생성하는 것도 유용하다.

자동생성된 산출물은 일회용품처럼 다룬다.

작성한 스크립트로 자동생성된 어떤 것이든 일회용품처럼 처리해만 된다: 작성한 스크립트가 모두 다시 자동생성할 수 있어야만 된다.

자동출력된 산출물을 관리하는 다른 방식은 많다. 각기 다른 분석마다 다른 하위디렉토리에 출력결과를 저장하는 것이 유용하다. 나중을 위해서 이런 접근법이 더 수월한데, 대부분의 분석이 탐색적이고, 최종 프로젝트에 채택되지도 않기 때문이고, 일부 분석 결과는 프로젝트 중간에 공유되기도 한다.

재사용되는 함수와 응용 프로그램을 구별한다.

R로 작업하는 가장 효과적인 방법이 인터랙티브 세션에서 여러가지 작업을 하다가, 제대로 동작하고 원하는 기능이 구현되면 스크립트 파일로 명령어를 복사해서 넣는 것이다. history 명령어를 사용해서 지금까지 입력한 모든 명령어를 저장할 수도 있다. 하지만, 명령어 90%가 시행착오라 그다지 유용하지 않을 수 있다.

프로젝트가 새롭고 참신할 때, 스크립트 파일에 대체로 직접 실행되는 코드 라인이 많이 포함되어 있다. 코드 성숙도가 높아짐에 따라, 재사용가능한 코드 덩어리를 함수로 뽑아낸다. 이런 함수를 별도 디렉토리에 몰아 넣는 것도 좋은 아이디어다; 여러 분석에 걸쳐 폭넓게 재사용되는 유용한 디렉토리와 분석 스크립트를 저장하는 디렉토리.

데이터 디렉토리에 데이터를 저장한다.

이제 멋진 디렉토리 구조를 갖추어서, data/ 디렉토리에 데이터 파일을 위치/저장한다.

도전 과제 1

gapminder 데이터를 웹사이트 에서 다운로드 한다.

  1. 파일을 다운로드한다 (CTRL + S, 마우스 우클릭 -> “Save as”, 혹은 File -> “Save page as”)
  2. gapminder-FiveYearData.csv 파일명으로 저장된 것인지 확인한다.
  3. 프로젝트 내부 data/ 디렉토리에 파일을 저장한다.

나중에 데이터를 불러 적재하고 검사작업을 진행한다.

버젼 제어

프로젝트를 설정해서, git을 통합시키고 버젼제어 아래 둔다. RStudio는 쉘보다 git에 더 멋진 인터페이스를 제공한다. 하지만, 기능이 매우 제한되어서, 때때로 쉘을 사용할 필요가 있다. Git을 경험해 보고 템플릿 파일에 대한 최초 커밋작업을 수행해보자.

작업공간/이력창에 “Git” 탭이 있다. 상자를 체크해서 파일 각각을 옮길 수 있다: stage 파일과 디렉토리 옆에 녹색 “A”, git이 아직 알 수 없는 파일과 디렉토리 옆에는 노란색 물음표가 보인다. RStudio에는 또한 커밋 사이에 파일간에 차이를 비교하여 보여주는 기능이 훌륭하다.

도전과제 2

  1. 프로젝트 내부에 graphs라는 디렉토리를 생성한다.
  2. graphs/ 파일을 포함하도록 .gitignore 파일을 변경시켜서, 이러한 일회성 출력산출물이 버젼관리되지 않도록 만든다.

  1. Data Munging, Data Wrangling 이라고 부름.