Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

R 변환 정의와 입출력 구현

R 변환은 .transforms 폴더의 YAML spec으로 입력, 출력과 실행할 R 스크립트를 연결합니다. 실행 시 리포지토리 프로젝트의 전체 내용을 사용할 수 있습니다. Code Workspaces에서 게시한 변환의 spec은 UI에서도 표시하고 구성할 수 있습니다.

프로젝트 구조와 별칭

다음은 테이블 필터와 그래프 파일 출력을 각각 정의한 예시 구조입니다.

.
├── .transforms
│   ├── happiness_ranking.yml
│   └── happiness_plot.yml
├── project
│   └── src
│       ├── top_10.R
│       └── gdp_plot.R
├── .Rprofile
└── renv.lock

스크립트는 spec의 alias로 데이터셋을 읽고 씁니다. YAML의 RID는 가상 예시값이므로 실제 입력과 출력 RID로 교체합니다. 출력 데이터셋은 먼저 수동 생성해야 합니다. R 변환의 checks 단계에서 새로운 출력 데이터셋을 자동 생성하는 방식은 지원하지 않습니다.

테이블을 읽고 필터링

예제 입력 happiness_2019에는 숫자 열 Overall_rank가 있어야 합니다. 다음 project/src/top_10.R은 순위 값이 10 이하인 행을 선택합니다. 결과가 반드시 10행이라는 뜻은 아니며 입력의 순위값에 따라 결정됩니다.

library(foundry)
library(dplyr)

happiness_2019 <- datasets.read_table("happiness_2019")
top_10 <- happiness_2019 %>% filter(Overall_rank <= 10)
datasets.write_table(top_10, "top_10_happiest_countries")

대응하는 .transforms/happiness_ranking.yml은 다음과 같습니다.

inputs:
- alias: "happiness_2019"
  properties:
    type: "dataset"
    dataset:
      rid: "ri.foundry.main.dataset.00000000-0000-0000-0000-000000000001"
outputs:
- alias: "top_10_happiest_countries"
  properties:
    type: "dataset"
    dataset:
      rid: "ri.foundry.main.dataset.00000000-0000-0000-0000-000000000002"
runtime:
  type: "rscript"
  rscript:
    identifier: "R.4.1.x"
    filePath: "project/src/top_10.R"

identifier는 실행 런타임 식별자입니다. 예시의 R.4.1.x는 R 4.1 minor release를 뜻하며 실제 환경에서 사용할 런타임을 선택합니다. filePath는 프로젝트 루트에서 실행 스크립트까지의 상대 경로입니다.

입력이나 출력을 늘리려면 각각의 목록에 alias와 RID 항목을 추가합니다. 출력은 정의만 추가하는 것으로 끝나지 않으며 스크립트에서 해당 alias에 실제 데이터를 써야 합니다.

PNG를 비정형 데이터셋으로 출력

다음 project/src/gdp_plot.R은 숫자 열 GDP_per_capita와 Overall_rank로 산점도 및 선형 회귀선을 그립니다. PNG 파일을 만든 뒤 출력 데이터셋의 파일로 올립니다.

library(foundry)
library(ggplot2)

happiness_2019 <- datasets.read_table("happiness_2019")
plot <- ggplot(happiness_2019, aes(GDP_per_capita, Overall_rank)) +
  geom_point() +
  stat_smooth(method = "lm", formula = y ~ x, geom = "smooth")

png("/tmp/model_plot.png")
print(plot)
dev.off()

datasets.upload_files("/tmp/model_plot.png", "happinessGDP_plot")

그래픽 장치를 연 뒤 print로 그림을 명시적으로 그립니다. 장치를 닫아 파일을 완성한 다음 업로드합니다. 대응 spec .transforms/happiness_plot.yml은 다음과 같습니다.

inputs:
- alias: "happiness_2019"
  properties:
    type: "dataset"
    dataset:
      rid: "ri.foundry.main.dataset.00000000-0000-0000-0000-000000000001"
outputs:
- alias: "happinessGDP_plot"
  properties:
    type: "dataset"
    dataset:
      rid: "ri.foundry.main.dataset.00000000-0000-0000-0000-000000000003"
runtime:
  type: "rscript"
  rscript:
    identifier: "R.4.1.x"
    filePath: "project/src/gdp_plot.R"

이 출력은 PNG 파일을 담는 데이터셋이며 미디어 집합을 선언한 spec은 아닙니다.

R 패키지와 환경 잠금

R 변환 리포지토리는 기본적으로 Posit Package Manager와 Bioconductor를 미러링하는 Artifacts Repository를 사용하도록 구성됩니다. RStudio Workbench에는 renv가 설치되어 있고 Packages 패널에서 사용 가능한 패키지를 찾아 설치 코드를 생성할 수 있습니다.

예제에서 필요한 패키지를 설치하고 잠금 파일을 기록하는 명령은 다음과 같습니다.

renv::install("foundry")
renv::install("dplyr")
renv::install("arrow")
renv::install("ggplot2")
renv::snapshot()

생성한 renv.lock을 커밋하여 패키지 상태를 보존합니다. 저장소에 잠금 파일이 있으면 변환 시작 부분이나 .Rprofile에서 다음 명령으로 환경을 복원할 수 있습니다.

renv::restore()

복원은 잠금 파일에 기록한 패키지 버전을 설치하는 동작입니다. 스크립트에서 사용하는 라이브러리와 선택한 R 런타임에 맞는 환경을 잠금 파일로 관리합니다.