# 通知設計書 19-group_split rowwise_df .keep無視

## 概要

本ドキュメントは、dplyrパッケージの`group_split()`関数において、`rowwise_df`に対して`.keep`引数が指定された場合に、その引数が無視されることを通知する警告メッセージの設計を記載する。

### 本通知の処理概要

`group_split()`関数は、グループ化されたデータフレームを各グループに分割してリストとして返す機能を提供する。`.keep`引数は、結果にグループ変数を含めるかどうかを制御する。しかし、`rowwise_df`（行ごとのグループ化）に対しては、各行が独立したグループとなるため、`.keep`引数は意味を持たず無視される。

**業務上の目的・背景**：`rowwise_df`では各行が1つのグループであり、グループ変数を「除外」するという概念が適用できない。ユーザーが`.keep = FALSE`を指定しても効果がないため、その旨を警告して混乱を防ぐ。

**通知の送信タイミング**：`group_split.rowwise_df()`メソッド内で、`.keep`引数が明示的に指定されている（`!missing(.keep)`）場合に警告が発生する。

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

**通知内容の概要**：「.keep is ignored in group_split(<rowwise_df>)」という固定メッセージが表示される。

**期待されるアクション**：ユーザーは`.keep`引数を削除するか、`rowwise_df`ではなく通常のgrouped_dfを使用することを検討する。

## 通知種別

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

## 送信仕様

### 基本情報

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

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

R言語の標準警告ハンドラを通じてコンソールに出力される。`suppressWarnings()`で抑制可能。

## 通知テンプレート

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

| 項目 | 内容 |
|-----|------|
| 形式 | 警告メッセージ |

### 本文テンプレート

```
.keep is ignored in group_split(<rowwise_df>)
```

### 添付ファイル

該当なし

## テンプレート変数

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

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 関数呼び出し | `group_split()`の実行（rowwise_dfに対して） | `.keep`引数が明示的に指定されている | `!missing(.keep)`がTRUE |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| `.keep`引数が指定されていない場合 | デフォルト値が使用されるため |
| `suppressWarnings()`でラップされている場合 | ユーザーが明示的に警告を抑制 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[group_split実行 on rowwise_df] --> B{...引数があるか}
    B -->|Yes| C[warn_ignores_dots通知]
    B -->|No| D{.keepが指定されているか}
    C --> D
    D -->|Yes| E[warn関数で通知]
    D -->|No| F[通知なし]
    E --> G[group_split_implを.keep=TRUEで実行]
    F --> G
    G --> H[結果を返す]
```

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

### 参照テーブル一覧

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

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

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

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

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

### リトライ仕様

該当なし

## 配信設定

### レート制限

該当なし（即座に1回表示）

### 配信時間帯

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

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

特になし。

## 備考

- `rowwise_df`に対する`group_split()`では、`.keep`は常にTRUEとして扱われる
- `...`引数も無視され、別の警告（`warn_ignores_dots()`）が表示される
- この関数はexperimental（実験的）ステータスであり、将来変更される可能性がある

---

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

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

### 推奨読解順序

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

`rowwise_df`は各行が独立したグループとして扱われる特殊なデータフレーム。

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

**読解のコツ**: `rowwise_df`は`grouped_df`の特殊形であり、グループ構造が異なることを理解する。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | group-split.R | `R/group-split.R` | 44-47行目の`group_split()`ジェネリック関数 |
| 2-2 | group-split.R | `R/group-split.R` | 68-93行目の`group_split.rowwise_df()`メソッド |

**主要処理フロー**:
1. **45行目**: `lifecycle::signal_stage("experimental", "group_split()")`でexperimental通知
2. **68-80行目**: 引数の検証（`keep`の非推奨チェック）
3. **81-87行目**: `...`引数の無視通知
4. **88-90行目**: `.keep`引数の無視通知
5. **92行目**: `group_split_impl(.tbl, .keep = TRUE)`で実行

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | group-split.R | `R/group-split.R` | 88-90行目の警告処理 |

**主要処理フロー**:
- **88行目**: `!missing(.keep)`で`.keep`が明示的に指定されているかチェック
- **89行目**: `warn(".keep is ignored in group_split(<rowwise_df>)")`で警告

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

```
group_split(.tbl, ..., .keep)  [on rowwise_df]
    │
    ├─ lifecycle::signal_stage()        # experimental通知
    │
    ├─ [keep引数の非推奨チェック]
    │
    ├─ [dots_n(...) > 0 の場合]
    │      └─ warn_ignores_dots()        # ...無視通知
    │
    ├─ [!missing(.keep) の場合]
    │      └─ warn()                      # 通知(本通知)
    │
    └─ group_split_impl(.tbl, .keep = TRUE)
           │
           ├─ ungroup()
           │
           ├─ group_rows()
           │
           └─ dplyr_chop()
```

### データフロー図

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

.tbl (rowwise_df) ───┐
                     │
... (引数) ──────────┼──▶ group_split.rowwise_df() ──▶ list_of(data.frame)
                     │           │
.keep (引数) ────────┘           │
                                 ├─▶ dots_n(...) チェック
                                 │        │
                                 │        ▼
                                 │   [警告: ...無視]
                                 │
                                 ├─▶ !missing(.keep) チェック
                                 │        │
                                 │        ▼
                                 │   [コンソール警告]
                                 │   ".keep is ignored in group_split(<rowwise_df>)"
                                 │
                                 └─▶ group_split_impl(.keep = TRUE)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| group-split.R | `R/group-split.R` | ソース | group_split()関数の実装 |
| rowwise.R | `R/rowwise.R` | ソース | rowwise_dfクラスの定義 |
