【Positron】拡張機能「Air」を使う【フォーマッタ】

Rのコードを自動で整えてくれる拡張機能です。

R
Positron
公開

2025年10月16日

最終更新

2025年11月2日

はじめに

Positronに標準でインストールされている拡張機能がいくつかあるのですが、その一つが「Air - R Language Support」です。

この拡張機能は、Rのコードを自動でフォーマットしてくれるもので、コードの可読性を向上させるのに役立ちます。

例えばどこで改行するのか、インデントはどうするのか、スペースをどこに入れるのかなどは人によってばらばらで、定まったルールがありません。場所によってスペースの有無が異なったり1行が長すぎたりするとコードが読みにくくなります。

Airは一定の規則に則りコードを整形してくれるので、コードの見た目を統一することができます。

これに関しては百聞は一見に如かずということで、早速使い方から実際の例まで見ていきましょう。

Airの使い方

AirはPositronに標準でインストールされているので、特にインストールする必要はありません。ただし、有効化はされていないので、設定から有効化していきましょう。

  1. Positronの設定を開きます。
    • 左下の歯車アイコンから開くか、Ctrl-,で開きます。
  2. 画面右上の「設定 (JSON) を開く」から設定ファイルを開きます。

1番左のアイコンです
  1. 設定ファイルに以下のコードを追加します。
    • 既に[ ]の中に記載があれば、その中に追記してください。
[
    "[r]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "Posit.air-vscode"
    }
]
  1. 保存します。

これで設定は完了です。.Rファイル内で、Rのコードは保存するたびに自動で整形されるようになります。

実際の例

ではこのフォーマッタの力はどれほどのものなのか、実際に見ていきましょう。

例えば以下のようなコードがあったとします。

my_function <- function(x,y){
if(x>y){return(x+y)}else{return(x-y)}
}
result<-my_function(10,5)print(result)

このコードはインデントがなく、スペースの使い方も一貫していません。これを修正したいわけですが、手作業だと面倒ですし、ミスも起こり得ます。

フォーマッタはコードの保存時に整形してくれますから、早速保存してみましょう。すると上のコードは以下のようになります。

my_function <- function(x, y) {
  if (x > y) {
    return(x + y)
  } else {
    return(x - y)
  }
}
result <- my_function(10, 5)
print(result)

インデントの追加やスペースの挿入など、コードが格段に読みやすくなりました。

リストなどで中身が多く1行に収まりきらない場合でも、適切に改行してくれます。

my_vector <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
my_data_frame <- data.frame(id = 1:10, value = rnorm(10),
                            category = sample(letters[1:3], 10, replace = TRUE))

このコードも悪いコードではないのですが、やや右に比重がかかっている印象ですね。これをフォーマッタにかけると以下のようになります。

my_vector <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
my_data_frame <- data.frame(
  id = 1:10,
  value = rnorm(10),
  category = sample(letters[1:3], 10, replace = TRUE)
)

data.frame()の中身が見やすくなりました。

ちなみにmy_vectorの方も、最初に1度だけ改行しておくと、全て改行するスタイルにしてくれます。少し中身を変えて試してみます。

# Before
my_vector <- c(
  "Jane Doe","John Smith")

# After
my_vector <- c(
  "Jane Doe",
  "John Smith"
)

このように最初だけ改行しておけば、1行が短い場合でも残りの要素を改行してくれます。フォーマッタの力を借りるのであれば、スペースも気にせず書き連ね、必要に応じて1か所改行して保存するだけで整形することができ、非常に楽かもしれません。

Tipコードのスタイルについて

Tidyverseの生みの親であるHadley Wickhamは、『R for Data Science』の中で、コードのスタイルについて以下のように述べています。

If the function you’re piping into has named arguments (like mutate() or summarize()), put each argument on a new line. If the function doesn’t have named arguments (like select() or filter()), keep everything on one line unless it doesn’t fit, in which case you should put each argument on its own line.

つまり、引数に名前がついている関数(dplyr::mutate()summarize()など)では各引数を改行し、名前がついていない関数(dplyr::select()filter()など)では1行にまとめるべきだとしています。

コード
library(dplyr)
library(nycflights13)

# Strive for
flights |>
  group_by(tailnum) |>
  summarize(
    delay = mean(arr_delay, na.rm = TRUE),
    n = n()
  )

# Avoid
flights |>
  group_by(
    tailnum
  ) |>
  summarize(delay = mean(arr_delay, na.rm = TRUE), n = n())

フォーマットを回避

場合によってはフォーマッタの力を借りたくない場合もあるかもしれません。その場合は、以下のようにコードの前後にコメントを入れることで、フォーマットを回避することができます。

# fmt: skip
my_vector <- c(1,2,3,4,5,6,7,
8,9,10)

このように# fmt: skipを入れることで、そのコードブロックはフォーマッタの対象外となります。

また、これはコードの途中に挟むこともできます。

df <- tibble::tibble(
  x = 1:5,
  y = 6:10
) |>
  # fmt: skip
  dplyr::mutate(
    z = x + y) |>
  dplyr::select(
    col1,
    col2,
    col3,
    col4
  )

同様に# fmt: skipを入れることで、その行以降はフォーマッタの対象外となります。コードの途中に挟んだ場合、その後のコードは再びフォーマッタの対象となるので注意してください。ここで言えばdplyr::select()の行は再びフォーマッタの対象となり、整形されています。

Quartoにも反映させたい

以上の設定は.Rファイルに対してのみ有効です。Quartoドキュメント内のRコードチャンクに対しても同じようにフォーマッタを適用したい場合は、以下の設定を追加してください。

[
    "[r]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "Posit.air-vscode"
    },

    // 以下を追記
    "[quarto]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "quarto.quarto"
    }
]

これでQuartoドキュメント内のRコードチャンクも保存するたびに自動で整形されるようになります。

おわりに

今回はPositronに標準でインストールされている拡張機能「Air」を紹介しました。

個人的にはコードの書き方にはその人の癖が出てそれはそれでよいものだと思っているのですが、とはいえ生成AIが発達してきた昨今ではコードもAIに書いてもらうことが増え、コードの品質の差はなくなってきているのではないかと思いますし、フォーマッタを使用することも今後より一般的になっていくのではないかと考えています。

Airは非常にシンプルで使いやすい拡張機能なので、ぜひ試してみてください。

参考