# 通知設計書 18-group_indices引数なし非推奨

## 概要

本ドキュメントは、dplyrパッケージの`group_indices()`関数を引数なしで呼び出した場合に表示される非推奨警告の設計を記載する。

### 本通知の処理概要

`group_indices()`関数は、データフレームの各行が属するグループのインデックスを返す機能を提供する。dplyr 1.0.0以降、引数なしでの呼び出しは非推奨となり、代わりに`cur_group_id()`の使用が推奨される。

**業務上の目的・背景**：`group_indices()`を引数なしで呼び出すことは、`mutate()`や`summarise()`内でのコンテキスト依存の動作を意味していた。dplyr 1.0.0で導入された`cur_group_id()`は、この用途に特化した関数であり、より明確なAPI設計となっている。旧来の使用法を非推奨とすることで、コードの明確性と保守性を向上させる。

**通知の送信タイミング**：`group_indices()`が引数なし（`nargs() == 0`）で呼び出された際に、`lifecycle::deprecate_warn()`を通じて警告が発生する。

**通知の受信者**：R言語のコンソールを使用している開発者・データアナリスト。警告はコンソールに直接出力される。

**通知内容の概要**：「`group_indices()` with no arguments was deprecated in dplyr 1.0.0. Please use `cur_group_id()` instead.」という形式のlifecycle警告が表示される。

**期待されるアクション**：ユーザーはコードを更新し、`group_indices()`の引数なし呼び出しを`cur_group_id()`に置き換える。

## 通知種別

コンソール警告メッセージ（`lifecycle::deprecate_warn()`による`warning`条件）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（関数実行中に即座に表示） |
| 優先度 | 中（非推奨警告） |
| リトライ | 無し |

### 送信先決定ロジック

R言語の標準警告ハンドラを通じてコンソールに出力される。`suppressWarnings()`で抑制可能。また、`lifecycle`パッケージの設定で制御可能。

## 通知テンプレート

### コンソール出力の場合

| 項目 | 内容 |
|-----|------|
| 形式 | lifecycle警告 |

### 本文テンプレート

```
`group_indices()` with no arguments was deprecated in dplyr 1.0.0.
i Please use `cur_group_id()` instead.
```

### 添付ファイル

該当なし

## テンプレート変数

該当なし（固定メッセージ）

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 関数呼び出し | `group_indices()`の実行 | 引数なしで呼び出された | `nargs() == 0`がTRUE |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 引数が指定されている場合 | 通常の使用法 |
| `always = TRUE`により同一IDで初回のみ | lifecycleパッケージの制御による |
| `suppressWarnings()`でラップされている場合 | ユーザーが明示的に警告を抑制 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[group_indices実行] --> B{nargs == 0か}
    B -->|Yes| C[lifecycle::deprecate_warn発行]
    C --> D[cur_group_idを呼び出して結果を返す]
    B -->|No| E[UseMethodでディスパッチ]
    E --> F[group_indices.data.frame]
    F --> G[グループインデックスを計算して返す]
    D --> H[終了]
    G --> H
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| 該当なし | - | インメモリデータフレーム操作 |

### テーブル別参照項目詳細

該当なし（データベースは使用しない）

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 該当なし | - | この通知自体はエラーではなく非推奨警告 |

### リトライ仕様

該当なし

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 同一IDでの重複表示 | セッション内で初回のみ（`id`パラメータによる） |

### 配信時間帯

該当なし（関数実行時に即座に表示）

## セキュリティ考慮事項

特になし。

## 備考

- `always = TRUE`が設定されているため、lifecycleの通常の抑制ルールに関わらず、重要な非推奨警告として表示される
- `id = "dplyr-group-indices-no-arguments"`で識別され、同一セッション内での重複警告を防ぐ
- 引数なしの場合、内部的に`cur_group_id()`を呼び出して互換性を維持している

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

`group_indices()`はグループ化情報からインデックスを計算する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | group-data.R | `R/group-data.R` | 1-45行目のドキュメントでgroup_indices()の概要を理解 |

**読解のコツ**: `group_data()`、`group_keys()`、`group_rows()`との関係を理解することが重要。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | group-data.R | `R/group-data.R` | 119-132行目の`group_indices()`関数 |

**主要処理フロー**:
1. **120行目**: `nargs() == 0`で引数なしかチェック
2. **121-127行目**: 引数なしの場合の非推奨警告と`cur_group_id()`呼び出し
3. **131行目**: 引数ありの場合は`UseMethod()`でディスパッチ

#### Step 3: 通知ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | group-data.R | `R/group-data.R` | 121-128行目の非推奨警告処理 |

**主要処理フロー**:
- **121-127行目**: `lifecycle::deprecate_warn()`で警告を発行
- **122行目**: バージョン「1.0.0」で非推奨化
- **123行目**: `I()`で引数なしの呼び出しを示す
- **124行目**: `cur_group_id()`を代替として提示
- **125行目**: `always = TRUE`で常に警告
- **126行目**: 重複防止のためのID
- **128行目**: `cur_group_id()`の結果を返す

### プログラム呼び出し階層図

```
group_indices()
    │
    ├─ [nargs() == 0 の場合]
    │      │
    │      ├─ lifecycle::deprecate_warn()  # 通知(本通知)
    │      │      ├─ "1.0.0"               # 非推奨バージョン
    │      │      ├─ I("...")              # 非推奨の使用法
    │      │      ├─ "cur_group_id()"      # 代替関数
    │      │      ├─ always = TRUE         # 常に警告
    │      │      └─ id = "..."            # 重複防止ID
    │      │
    │      └─ cur_group_id()               # 代替関数を呼び出し
    │
    └─ [引数ありの場合]
           │
           └─ UseMethod("group_indices")
                  │
                  └─ group_indices.data.frame()
```

### データフロー図

```
[入力]                    [処理]                         [出力]

(引数なし) ─────────────▶ group_indices() ──▶ グループインデックス
                                │
                                ├─▶ nargs() == 0 チェック
                                │
                                ├─▶ lifecycle::deprecate_warn()
                                │        │
                                │        ▼
                                │   [コンソール警告]
                                │   "`group_indices()` with no arguments..."
                                │
                                └─▶ cur_group_id()
                                         │
                                         ▼
                                    [現在のグループID]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| group-data.R | `R/group-data.R` | ソース | group_indices()関数の実装 |
| context.R | `R/context.R` | ソース | cur_group_id()関数の実装 |
