R Academy · レッスン

演算子の優先順位と複雑な式

評価順序を理解し、複雑な式を安全に記述します。

レッスン 4/413 ステップ

「演算子の優先順位と複雑な式」はCoddyKit上の無料R Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

演算子の優先順位とは

演算子の優先順位は、式の中で演算を評価する順序を決定します。数学と同じように、乗算は加算より先に評価されます。Rには明確に定義された優先順位表があります。

# Precedence in action
result1 <- 2 + 3 * 4    # * before +
result2 <- (2 + 3) * 4  # parentheses override
cat('2 + 3 * 4 =', result1, '
')   # 14
cat('(2+3) * 4 =', result2, '
')   # 20

Rの優先順位表(高い順)

Rでは、演算子を次の順序(優先度が高い順)で評価します:

  1. ^ — 累乗
  2. -(単項)— 符号反転
  3. : — シーケンス
  4. %%, %/%, %*%, %in% — 特殊な中置演算子
  5. *, / — 乗算、除算
  6. +, -(二項)— 加算、減算
  7. <, >, <=, >=, ==, != — 比較
  8. ! — NOT
  9. &, && — AND
  10. |, || — OR
  11. <-, = — 代入
# Exponentiation before multiplication
cat('2 * 3 ^ 2 =', 2 * 3 ^ 2, '
')   # 2 * 9 = 18
cat('(2*3)^2 =', (2 * 3) ^ 2, '
')   # 6^2 = 36

# Unary minus applied after exponentiation
cat('-2 ^ 2 =', -2 ^ 2, '
')    # -(2^2) = -4
cat('(-2)^2 =', (-2) ^ 2, '
')  # 4

コロン演算子の優先順位

:シーケンス演算子は+や-より優先順位が高いため、初心者がよく間違えます。1:n+1は1:(n+1)ではなく、(1:n)+1として解釈されます。

n <- 5

# Common mistake: colon before addition
cat('1:n+1 =', 1:n + 1, '
')   # (1:5)+1 = 2 3 4 5 6
cat('1:(n+1) =', 1:(n + 1), '
') # 1:6 = 1 2 3 4 5 6

# These are DIFFERENT results!
# Always use parentheses when the upper bound involves arithmetic

特殊な演算子の優先順位

%%、%/%、%in%などの特殊な演算子は、+や-より優先順位が高く、^より低くなります。これを誤解すると、見つけにくいバグにつながります。

# %% has higher precedence than +
cat('10 + 7 %% 3 =', 10 + 7 %% 3, '
')   # 10 + (7%%3) = 10+1 = 11
cat('(10+7) %% 3 =', (10 + 7) %% 3, '
') # 17 %% 3 = 2

# %in% precedence
nums <- 1:5
cat('1 + 1 %in% nums =', 1 + 1 %in% nums, '
')  # (1+1) %in% nums? No! 1 + (1 %in% nums) = 2

論理演算子より先に比較

比較演算子(<、>、==など)は、論理演算子(!、&、|)より先に評価されます。そのため、x > 0 & y < 10は、余分な括弧がなくても期待どおりに動作します。

x <- 5
y <- 8

# This works as intended: comparisons first, then &
cat('x > 0 & y < 10:', x > 0 & y < 10, '
')  # TRUE & TRUE = TRUE

# ! NOT has higher precedence than &
vec <- c(TRUE, FALSE, TRUE)
cat('!vec & TRUE:', !vec & TRUE, '
')  # (!vec) & TRUE, not !(vec & TRUE)
cat('!(vec & TRUE):', !(vec & TRUE), '
')

紛らわしい優先順位のバグ #1

よくあるバグの一つは、!の優先順位が比較演算子より低いと思い込むことです。実際には!x == yは!(x == y)ではなく、(!x) == yとして解釈されます。

x <- 5
y <- 5

# BUG: meant to check 'x is not equal to y'
bug_result <- !x == y      # reads as (!x) == y
cat('!x == y (bug):', bug_result, '
')   # !5 means FALSE, FALSE==5 is FALSE

# CORRECT: use != or !(x == y)
cat('x != y:', x != y, '
')             # FALSE (correct)
cat('!(x == y):', !(x == y), '
')       # FALSE (correct)

紛らわしい優先順位のバグ #2

もう一つの微妙なバグは、-1:5が-1, 0, 1, 2, 3, 4, 5というシーケンスを作ることです。単項マイナスは範囲全体ではなく1だけに適用されます。負の値から始まる範囲を作るには、括弧を使用してください。

# Misleading: looks like range from -1 to 5 starting at negative
seq1 <- -1:5
cat('-1:5 =', seq1, '
')  # -1 0 1 2 3 4 5 (correct here)

# But -2^2 is a trap:
cat('-2^2 =', -2 ^ 2, '
')    # -4 (not 4)
cat('(-2)^2 =', (-2) ^ 2, '
') # 4

# Always parenthesise to be safe
cat('(-1):5 =', (-1):5, '
')   # same as -1:5 but explicit

明確さのために括弧を使う

括弧が厳密には必要ない場合でも、括弧を使うとコードが読みやすくなり、エラーも起きにくくなります。優先順位表をすべて暗記しようとせず、括弧を使って意図を明確に表してください。

# Hard to read — requires knowing precedence
result_unclear <- 2 + 3 * 4 ^ 2 / 8 - 1

# Clear intent with parentheses
result_clear <- 2 + ((3 * (4 ^ 2)) / 8) - 1

cat('Unclear:', result_unclear, '
')
cat('Clear:  ', result_clear, '
')
cat('Same result?', result_unclear == result_clear, '
')

式の中での代入

代入(<-)の優先順位は非常に低く、ほとんどの演算子より低くなります。そのため、複雑な式の結果を1行で代入できますが、式の中に代入を含めると予想外の動作になることもあります。

# <- has very low precedence
# This assigns (3 + 4) to x, then evaluates (TRUE)
result <- x <- 3 + 4   # x gets 7, result gets 7
cat('x:', x, 'result:', result, '
')

# Be careful with == vs <- 
# x <- 5 is assignment
# x == 5 is comparison (always use == for testing)

実践:優先順位エラーを避ける

複雑な式を正しく書くための実践的な方法は、長い式を名前付きの中間ステップに分割することです。各ステップを確認できるため、デバッグもしやすくなります。

# Complex formula: compound interest
principal <- 1000
rate <- 0.05
years <- 10

# Hard to verify in one line
bad <- principal * (1 + rate) ^ years

# Easier to verify step by step
growth_factor <- (1 + rate) ^ years
final_amount <- principal * growth_factor
cat('Growth factor:', round(growth_factor, 4), '
')
cat('Final amount: $', round(final_amount, 2), '
')

論理AND/ORにおける優先順位

&(AND)は|(OR)より優先順位が高くなります。そのため、A | B & CはA | (B & C)として評価されます。微妙な論理バグを避けるため、ANDとORを組み合わせるときは必ず括弧を使用してください。

A <- TRUE
B <- FALSE
C <- TRUE

# & before | — may surprise you
cat('A | B & C:', A | B & C, '
')     # A | (B & C) = TRUE | FALSE = TRUE
cat('(A|B) & C:', (A | B) & C, '
')   # TRUE & TRUE = TRUE

# Different with:
A2 <- FALSE
cat('A2 | B & C:', A2 | B & C, '
')   # FALSE | (FALSE & TRUE) = FALSE
cat('(A2|B) & C:', (A2 | B) & C, '
') # (FALSE|FALSE) & TRUE = FALSE

理解度チェック

Rでは-3 ^ 2は何と評価されますか?

まとめ:演算子の優先順位

すばらしいです!このレッスンの重要なポイントは次のとおりです:

  • 優先順位(高い → 低い):^、単項-、:、%%/%/%*%%in%、*/、+-、比較、!、&、|、代入
  • -2^2 = -4となるのは、^が単項マイナスより優先されるためです。4にするには(-2)^2を使用します
  • 1:n+1は(1:n)+1を意味します。より長い範囲が必要な場合は1:(n+1)を使用します
  • &は|より強く結合します。AND/ORを混在させる論理には括弧を付けます
  • 迷ったら括弧を使用し、意図を明示してバグを避けてください
# Golden rule: parentheses for clarity
n <- 4
# Intended: sequence 1 to n+1
cat('Wrong : 1:n+1  =', 1:n + 1, '
')
cat('Correct: 1:(n+1)=', 1:(n + 1), '
')

# Intended: -(2^2)
cat('Correct: -2^2 = -(2^2) =', -2 ^ 2, '
')
無料で開始

AI チューターと学ぶ R — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
43
レッスン
159

よくある質問

「演算子の優先順位と複雑な式」レッスンは無料ですか?

はい。「演算子の優先順位と複雑な式」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「演算子の優先順位と複雑な式」で何を学びますか?

評価順序を理解し、複雑な式を安全に記述します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「演算子の優先順位と複雑な式」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 算術演算子と比較演算子
  2. 論理演算子とブール論理
  3. 代入演算子と特殊演算子
  4. 演算子の優先順位と複雑な式
← R Academyに戻る