# 通知設計書 26-slice 1列行列非推奨

## 概要

本ドキュメントは、dplyrパッケージの `slice()` 関数において、1列の行列を使用してスライシングすることが非推奨となったことに関する通知の設計書です。

### 本通知の処理概要

この通知は、`slice()` 関数内でインデックスとして1列の行列が使用された場合に発生する非推奨警告の処理内容を定義します。

**業務上の目的・背景**：Rでは、行列と整数ベクトルは異なるデータ型であり、意図しない動作を引き起こす可能性があります。`slice()` 関数は本来、整数ベクトルを期待しており、1列の行列が渡された場合は暗黙的にベクトルに変換されていました。この非推奨警告により、開発者に対してコードの明確化と潜在的なバグの防止を促しています。

**通知の送信タイミング**：`slice()` 関数の実行中に、インデックス式の評価結果が1列の行列である場合に警告が発生します。これは `slice_eval()` 関数内で検出されます。

**通知の受信者**：dplyrパッケージを使用するRユーザー（データサイエンティスト、統計分析者、Rプログラマー）が対象です。特に、行列演算と組み合わせたスライシング処理を行っている開発者に向けた通知です。

**通知内容の概要**：警告メッセージとして「1列行列を使ったスライシングは非推奨」という内容が表示されます。

**期待されるアクション**：受信者はインデックス式を修正し、1列の行列ではなく整数ベクトルを返すようにすることが期待されます。例えば、`as.vector()` や `[,1]` を使用して明示的にベクトルに変換することが推奨されます。

## 通知種別

コンソール警告（lifecycle::deprecate_warn）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（関数実行時即時） |
| 優先度 | 中 |
| リトライ | 無 |

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

Rセッション内で `slice()` を呼び出し、インデックス式の評価結果が1列の行列である場合にコンソールを通じて警告メッセージが表示されます。この警告は `lifecycle` パッケージの `deprecate_warn()` 関数により管理され、`always = TRUE` により毎回表示されます。

## 通知テンプレート

### コンソール警告の場合

| 項目 | 内容 |
|-----|------|
| 送信元 | dplyrパッケージ |
| 送信元名称 | lifecycle::deprecate_warn |
| 形式 | テキスト |

### 本文テンプレート

```
Slicing with a 1-column matrix was deprecated in dplyr 1.1.0.
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| when | 非推奨となったバージョン | ハードコード値 "1.1.0" | Yes |
| what | 非推奨となった機能 | ハードコード値 "Slicing with a 1-column matrix" | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 関数呼び出し | `slice()` またはその派生関数 | インデックスが1列行列である | `is.matrix(slice_idx) && mat_n_col(slice_idx) == 1` |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| インデックスが整数ベクトルの場合 | 正常な使用方法として処理される |
| 行列が2列以上の場合 | 別のエラーとして処理される |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[slice関数呼び出し] --> B[slice_eval関数実行]
    B --> C[各インデックス式を評価]
    C --> D{結果が行列か?}
    D -->|Yes| E{1列行列か?}
    D -->|No| F[通常処理継続]
    E -->|Yes| G[lifecycle::deprecate_warn発行]
    E -->|No| H[エラー発生]
    G --> I[slice_idx[,1]でベクトルに変換]
    I --> F
```

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

### 参照テーブル一覧

該当なし（インメモリ処理のみ）

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

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

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| セッションあたり | 無制限（always = TRUE により毎回表示） |

### 配信時間帯

制限なし（関数呼び出し時に即時発行）

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

特になし。本通知はユーザーコンソールへの警告表示のみで、個人情報やセキュリティに関わるデータは含まれません。

## 備考

- この非推奨警告は dplyr 1.1.0 で導入されました
- `id = "dplyr-slice-one-column-matrix"` により警告が識別されます
- 警告発行後、1列行列は自動的にベクトルに変換されて処理が継続されます
- `always = TRUE` により、条件が満たされるたびに警告が表示されます

---

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

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

### 推奨読解順序

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

まず、sliceのインデックスがどのように評価されるかを理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | slice.R | `R/slice.R` | `slice_eval()` 関数の構造を理解する |

**読解のコツ**: `is.matrix()` と `mat_n_col()` による行列検出パターンを理解することが重要です。

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

処理の起点となる関数を特定します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | slice.R | `R/slice.R` | `slice()` 関数の定義 |
| 2-2 | slice.R | `R/slice.R` | `slice.data.frame()` メソッドの実装 |

**主要処理フロー**:
1. **行131-141**: `slice()` ジェネリック関数の定義
2. **行143-158**: `slice.data.frame()` メソッドの実装
3. **行393-414**: `slice_rows()` 関数の実装

#### Step 3: 行列検出と警告発行を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | slice.R | `R/slice.R` | `slice_eval()` 関数の行列チェックロジック |

**主要処理フロー**:
- **行424-484**: `slice_eval()` 関数の完全な実装
- **行440-449**: 1列行列の検出と警告発行
- **行440**: `is.matrix(slice_idx) && mat_n_col(slice_idx) == 1` による検出
- **行441-448**: `lifecycle::deprecate_warn()` 呼び出し
- **行449**: `slice_idx[, 1]` でベクトルへの変換

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

```
slice()
    │
    └─ slice.data.frame()
           │
           └─ slice_rows()
                  │
                  └─ slice_eval()
                         │
                         └─ impl() 内部関数
                                │
                                ├─ ...elt(i) - 各引数の評価
                                │
                                ├─ is.matrix() && mat_n_col() == 1
                                │      │
                                │      └─ lifecycle::deprecate_warn()
                                │
                                └─ slice_idx[, 1] - ベクトル変換
```

### データフロー図

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

インデックス式 ───▶ slice_eval() ───▶ 1列行列検出
     │                   │                    │
     │                   └─▶ 警告発行 ────────┴─▶ 警告メッセージ
     │                   │
     └───────────────────┴─▶ ベクトル変換 ───▶ スライス結果
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| slice.R | `R/slice.R` | ソース | slice関数と非推奨チェックの実装 |
| lifecycle | 外部パッケージ | 依存関係 | deprecate_warn関数の提供 |
