jarticr
Source:AGENTS.md
日本道路交通情報センター(JARTIC)オープンデータ「断面交通量情報(type B)」を R で読み込む R パッケージ。
本ファイルは全エージェント共通の正典で、Codex は直接、Claude Code は CLAUDE.md 1 行目の @AGENTS.md 経由で読む(CLAUDE.md は Claude Code 専用で Codex に届かない)。本ファイルは 32 KiB(32,768 バイト)を超えてはならない(Codex が警告なく打ち切る。検査は sh tools/check-instructions-size.sh と git / Claude Code の hook)。@ 記法で分割しない。R パッケージとしての規約を定める(targets パイプラインの研究プロジェクトではない)。
プロジェクト概要
-
GitHub リポジトリ:
uribo/jarticr - pkgdown: https://uribo.github.io/jarticr/
- 関連リポジトリ: uribo/jartic_storage(ダウンロード・parquet 変換のワークフロー。本パッケージを利用する側)
- 公開状況: 未 CRAN。GitHub からのインストールのみ
ディレクトリ構成
jarticr/
├── DESCRIPTION # 依存マニフェスト(renv は使わない。理由は下記)
├── NAMESPACE # roxygen2 生成物。手で編集しない
├── R/ # 関数定義・データドキュメント
├── man/ # roxygen2 生成物。手で編集しない
├── data/ # エクスポートするデータ(.rda)
├── data-raw/ # data/ と inst/dummy/ の生成スクリプト(.Rbuildignore 済み)
├── inst/dummy/ # テスト用の小さな固定データ(CP932)
├── tests/testthat/ # testthat(3rd edition)
├── .github/workflows/ # R-CMD-check, pkgdown
├── memory/ # プロジェクト固有知識(会話間引き継ぎ)
├── AGENTS.md # 本ファイル(全エージェント共通の正典)
├── CLAUDE.md # @AGENTS.md + Claude Code 固有の設定
└── .codex/config.toml # Codex の sandbox・環境変数ポリシー
.vscode/の追跡方針: 作者のグローバル gitignore は.vscodeを無視するが、本リポジトリでは.gitignoreの!.vscode/で再包含し意図的に追跡する。内容はワークフロー設定(air の formatOnSave・推奨拡張)に限り、テーマ・フォント等の個人的好みは置かない。
依存管理は renv ではなく DESCRIPTION
本リポジトリは renv を使わない。R パッケージは DESCRIPTION の Imports / Suggests が依存の正典であり、CI(r-lib/actions/setup-r-dependencies)もそこから解決する。依存を足したら DESCRIPTION に書く。renv.lock / .Rprofile を持ち込まない(research-project-template の renv 一式は、あちらが DESCRIPTION を持たない解析プロジェクトだから必要なものであって、ここでは二重管理になる)。
R コード記述
スタイル
-
tidyverse スタイルを air でフォーマット(
air.toml、編集時に hook で自動実行) - 関数にはパッケージ名前空間プレフィックスを付ける:
data.table::fread()、stringr::str_squish() - roxygen2 の
@importFromで宣言した関数のみ、プレフィックスなしで使ってよい - 変数名は英語のみ。コメント・ドキュメント・コミットメッセージは英語
- モダン tidyverse パターンを優先し superseded パターンを避ける。ただし本パッケージの戻り値は
data.tableであることが公開 API の一部なので、置き換えの際は戻り値のクラスが変わらないことを必ず確認する(tidyr の関数は data.table を plaindata.frameに落とす)。クラスが変わるなら破壊的変更として別途扱う
生成物を手で編集しない
NAMESPACE と man/*.Rd は roxygen2 の生成物。roxygen コメントを直したら再生成する。
roxygen2 8.x はバージョンを DESCRIPTION の Config/roxygen2/version に記録する(7.x までの RoxygenNote は書かれない)。再生成なしにこのフィールドだけ書き換えない(man/ の内容と食い違う)。roxygen コメントは markdown 記法で書く(Roxygen: list(markdown = TRUE))。
データとフィクスチャ
-
data/*.rdaはdata-raw/DATASET.Rからusethis::use_data()で生成する -
inst/dummy/type_b.csv(10 列・現行)とinst/dummy/type_b_9col.csv(9 列・2018-02 より前)はdata-raw/dummy_typeB.Rから生成する。CP932 バイト列なので手で編集しない。UTF-8 で書き直すとread_jartic_traffic()のiconv(from = "cp932")が地点名を文字化けさせ、テストが無意味な値を検証する状態になる。実データに合わせてヘッダ行と CRLF を持たせてある - 生の JARTIC データ(都道府県別 CSV / ZIP)はコミットしない。
.gitignoreで除外済み
type B の配布形式(実データで確認済み)
前提を推測で書かない。以下は 2017-08 の全 51 提供元と 2026-06(徳島)の実ファイルを走査して確認した事実。
| 項目 | 2018-02 より前 | 2018-02 以降 |
|---|---|---|
| ヘッダ行 | あり(時刻,…,リンク終端からの距離(10m)) |
あり(時刻,…,リンク終端からの距離(×10m),リンクバージョン) |
| 列数 | 9(link_ver なし) |
10 |
| 日時 |
2017/8/1 0:00:00 と 2017/08/01 00:05 が提供元ごとに混在(2017-08 は 40 : 11) |
2026/06/01 00:00 |
| 改行 | CRLF | CRLF |
ヘッダ行は全期間で存在する。fread(header = FALSE) を無条件に渡すとヘッダが観測値として混入し、現行月のファイルすら読めない(#3)。read_jartic_traffic() は先頭行の 1 行目だけを読んで「ヘッダの有無」と「列数」を判定し、skip と colClasses / col.names を切り替える。9 列期は link_ver を NA_integer_ で補い、戻り値は常に 10 列に保つ。
テスト
- testthat 3rd edition(
Config/testthat/edition: 3) - フィクスチャのパスは
tests/testthat/helper-fixture.Rのtype_b_fixture()/type_b_9col_fixture()経由で取る(system.file()を各テストに散らさない) - 検証は「読み込みの契約」に集中する: 列名・列の型・タイムゾーン・キー・欠測の扱い・CP932 と NFKC の正規化結果
-
to_link_end_10mが character のままであることを必ず検証する。integer に落とすと元の表記(ゼロ埋め等)が失われ、静かにデータが壊れる。なお 2017-08 / 2026-06 の実データを走査した範囲ではゼロ埋めは観測されていない。それでも character を保つのは、公開 API の型であると同時に、表記の揺れを読み込み側で潰さないため
作業時の注意
コミット規約
Conventional Commits v1.0.0 に準拠する。コミットメッセージは英語。Co-Authored-By: フッターは付けない。
| scope | 対象 |
|---|---|
read |
read_jartic_traffic()(読み込み) |
xroad |
国土交通省 xROAD 交通量 API(R/xroad_traffic.R) |
location |
観測地点テーブル(R/location.R) |
data |
同梱データ・data-raw/ の生成スクリプト |
deps |
DESCRIPTION の依存 |
ci |
.github/workflows/ |
docs |
README・roxygen・pkgdown |
test |
tests/ |
例:
feat(read): support type A traffic files
feat(xroad): reject specification-style quoted CQL filters
fix(location): keep unsplit location names when the arrow is absent
test(read): pin the CP932 decoding contract
chore(deps): move tibble to Suggests
セキュリティ・データ取り扱い
- 認証情報(API key、サービスアカウント JSON、
.env)をコミットしない - 資格情報ファイル・
.env・認証用 JSON・秘密鍵など、秘密を保存するためのファイルを読まない・編集しない・出力しない・検索しない・要約しない - 認証付きのアクセスが要るときは、必要な認証情報・環境変数を説明して許可を得てから有効にする。値をプロンプト・ログ・コマンド出力・コミットに含めない
- Claude Code / Codex の通常セッションでは
R_ENVIRON_USER=/dev/nullとし、R に資格情報ファイルを自動ロードさせない(.claude/settings.json/.codex/config.toml)。同ファイルでLC_COLLATE=Cを設定し、sort()/factor()の水準順がマシン依存にならないようにしている。この 2 つのキーを消さない - コミット前に
git statusで意図しないファイル(生データ・生成物)が含まれていないか確認する
既知の課題
コードの挙動を変える変更なので、着手前にユーザーへ確認する。
- type A(旅行時間情報)には未対応。
read_jartic_traffic()は type B 専用 - arrow スキーマ対応は一度入れて revert された(
dfdd6e9→8e7f3a6)。再導入するならarrowはSuggestsに置き、無い環境でスキップできる形にする