Skip to content

Instantly share code, notes, and snippets.

@terashim
Created June 8, 2021 15:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save terashim/0a462ce80c3a258ca39931eafe910cbc to your computer and use it in GitHub Desktop.
Save terashim/0a462ce80c3a258ca39931eafe910cbc to your computer and use it in GitHub Desktop.
Target Markdown の検証
---
title: "Target Markdown の検証"
author: "@terashim_"
date: "2021-06-08"
output: html_document
---
```{r setup, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>",
tar_interactive = FALSE)
```
# 目的
[`targets`](https://docs.ropensci.org/targets/) バージョン 0.5.0 でリリースされる
[Target Markdown](https://books.ropensci.org/targets/markdown.html)
の機能を利用すると、R Markdown 文書中で targets パイプラインを定義できる。
しかし、ドキュメントに示されている例ではターゲットを定義するコードとその実行結果が離れた位置に来てしまう。コードと結果の対応をわかりやすく示すためには近くに表示したい。
そこで、ターゲット定義コードの近くに実行結果を表示するにはどうすれば良いか調べる。
# わかったこと
* `targets` チャンクをすべて実行する前に `tar_make()` を実行すると、その時点までに完成したパイプラインが実行される。
* `targets` チャンクを追加してからまた `tar_make()` を実行してもちゃんとキャッシュが効く。
* ターゲット定義チャンクの近くにその実行結果を表示したい場合は、ターゲット定義チャンクの直後で `tar_make()` と `tar_read()` を実行する。
-----
# セットアップ
まず `targets` をロードする
```{r}
library(targets)
```
もし過去に生成されたパイプライン定義ファイル(`_targets_r` フォルダ)が残っていたら削除しておく
```{r}
tar_unscript()
```
もし過去のパイプライン実行結果(`_targets/` フォルダ)が残っていたら削除する
```{r}
tar_destroy()
```
# グローバルオブジェクトを定義する
targets のオプション設定やグローバル関数・グローバル変数の定義には
`targets` チャンクに `tar_globals = TRUE` のオプションをつける。
このチャンクを対話モードで実行すると普通にRコードとして実行され、グローバル環境の変数に値が代入される。
非対話モードで実行すると `_targets_r/globals/` フォルダにスクリプトファイルが作成される。
```{targets example-globals, tar_globals = TRUE}
options(tidyverse.quiet = TRUE)
tar_option_set(packages = c("biglm", "dplyr", "ggplot2", "readr", "tidyr"))
create_plot <- function(data) {
ggplot(data) +
geom_histogram(aes(x = Ozone), bins = 12) +
theme_gray(24)
}
```
# ターゲットを定義する
`targets` チャンクに `tar_globals` オプションをつけない場合、target オブジェクトの定義を表す。
このチャンクを対話モードで実行すると、単にグローバルオブジェクト `raw_data` にコマンド `airquality` の戻り値が代入される。
非対話モードで実行すると、`_targets_r/targets/` フォルダにターゲット定義用のスクリプトが生成される。
```{targets raw-data}
tar_target(raw_data, airquality)
```
# パイプラインの確認と実行
上記の `targets` チャンクが非対話モードで実行してあれば、`targets` パイプラインが定義されている。
この時点でパイプラインを可視化してみる。
```{r}
tar_visnetwork()
```
この時点でパイプラインを実行してみる
```{r}
tar_make()
```
もう一度パイプラインを可視化してみる
```{r}
tar_visnetwork()
```
# パイプラインにターゲットを追加する
`targets` チャンクでパイプラインにターゲットを追加する
```{targets downstream-targets}
list(
tar_target(data, raw_data %>% filter(!is.na(Ozone))),
tar_target(hist, create_plot(data))
)
```
またパイプラインを可視化する
```{r}
tar_visnetwork()
```
既に実行済みのターゲット `raw_data` は "Up to date" の状態に、
新しく追加されたターゲット `data`, `hist` は "Outdated" の状態になっている。
パイプラインを再実行する。
```{r}
tar_make()
```
"Up to date" だったターゲット `raw_data` の実行はスキップされ、新しいターゲット `data`, `hist` が実行される。
また可視化する
```{r}
tar_visnetwork()
```
すべて "Up to date" になっている。
ターゲット `hist` の実行結果を読み取って表示する
```{r}
tar_read(hist)
```
# `tar_simple = TRUE` オプション
また `targets` チャンクで新たなターゲットを追加する。
このとき `tar_simple = TRUE` オプションを利用する。
このチャンクは `tar_target(fit, biglm(Ozone ~ Wind + Temp, data))` でターゲットを定義するのと同じ意味になる。
```{targets fit, tar_simple = TRUE}
biglm(Ozone ~ Wind + Temp, data)
```
またパイプラインを可視化
```{r}
tar_visnetwork()
```
パイプラインを再実行
```{r}
tar_make()
```
また可視化
```{r}
tar_visnetwork()
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment