Menu
Coddy logo textTech

リスト要素へのアクセス

CoddyのRジャーニー「基礎」セクションの一部 — レッスン 72/78。

リストでは、ベクトルとは異なる要素アクセスの構文を使用します。主な違いは、一重ブラケット [ ] と二重ブラケット [[ ]] の使い分けにあります。

二重括弧は、リストから実際の要素を抽出します:

my_list <- list(42, "hello", TRUE)
print(my_list[[1]])

出力:

[1] 42

単一の角括弧は、要素そのものではなく、その要素を含むサブリストを返します:

my_list <- list(42, "hello", TRUE)
print(my_list[1])

出力:

[[1]]
[1] 42

この違いは、実際の値を操作したい場合に重要になります。リストの要素がベクトルの場合、二重括弧を使用するとその要素に直接アクセスでき、さらにベクトルのインデックス指定を使用できます。

my_list <- list(c(10, 20, 30), "text")
print(my_list[[1]][2])

出力:

[1] 20

ここでは、my_list[[1]] はベクトルを取得し、[2] はその2番目の要素にアクセスします。覚えておいてください:実際のコンテンツが必要な場合には [[ ]] を使用し、より小さなリストが必要な場合には [ ] を使用します。

challenge icon

チャレンジ

簡単

2行の入力が与えられます:

  1. 異なる型の3つのカンマ区切り値(例:100,hello,TRUE
  2. 4番目の要素として格納される、ベクトルを表すカンマ区切りの数値リスト(例:5,10,15,20

以下の操作を実行してください:

  1. 数値、テキスト、論理値、および数値ベクトルの4つの要素を持つリストを作成します。
  2. 二重ブラケットを使用して、2番目の要素(テキスト値)を抽出して出力します。
  3. 一重ブラケットを使用して3番目の要素を抽出し、結果を出力します(出力形式の違いに注意してください)。
  4. 二重ブラケットを使用して4番目の要素に格納されているベクトルにアクセスし、ベクトルインデックスを使用してその3番目の値を抽出して出力します。
  5. 4番目の要素にあるすべての数値の合計を出力します(二重ブラケットでベクトルにアクセスし、sum()を使用します)。

例えば、入力が以下の場合:

42,world,FALSE
8,16,24,32,40

出力は以下のようになります:

[1] "world"
[[1]]
[1] FALSE

[1] 24
[1] 120

解説:

  • my_list[[2]] は実際のテキスト値 "world" を抽出します。
  • my_list[3] は FALSE を含むサブリストを返します(出力の [[1]] に注目してください)。
  • my_list[[4]][3] はベクトルにアクセスし、その3番目の要素である 24 を取得します。
  • sum(my_list[[4]]) は 8+16+24+32+40 = 120 を計算します。

チートシート

リストでは、要素にアクセスするために異なるブラケット構文を使用します:

二重ブラケット [[ ]] は、実際の要素を抽出します:

my_list <- list(42, "hello", TRUE)
print(my_list[[1]])  # 出力: [1] 42

単一ブラケット [ ] は、その要素を含むサブリストを返します:

my_list <- list(42, "hello", TRUE)
print(my_list[1])  # 出力: [[1]] [1] 42

入れ子になった要素へのアクセス: 二重ブラケットを使用してリストからベクトルを抽出し、次にベクトルのインデックスを使用します:

my_list <- list(c(10, 20, 30), "text")
print(my_list[[1]][2])  # 出力: [1] 20

実際のコンテンツが必要な場合は [[ ]] を使用し、より小さなリストが必要な場合は [ ] を使用します。

自分で試してみよう

# 入力を読み込む
con <- file("stdin", "r")
input1 <- suppressWarnings(readLines(con, n = 1))  # 1行目:3つのカンマ区切り値
input2 <- suppressWarnings(readLines(con, n = 1))  # 2行目:ベクトルのためのカンマ区切り数値
close(con)

# 最初の入力行を個別の値にパースする
values <- strsplit(input1, ",")[[1]]
numeric_val <- as.numeric(values[1])
text_val <- values[2]
logical_val <- as.logical(values[3])

# 2番目の入力行を数値ベクトルにパースする
vector_val <- as.numeric(strsplit(input2, ",")[[1]])

# TODO: 以下にコードを記述してください
# 1. numeric_val、text_val、logical_val、vector_valの4つの要素を持つリストを作成する
# 2. 二重ブラケット [[ ]] を使用して2番目の要素を抽出し、表示する
# 3. 単一ブラケット [ ] を使用して3番目の要素を抽出し、表示する
# 4. 二重ブラケットで4番目の要素にアクセスし、その3番目の値を抽出する
# 5. 4番目の要素に含まれるすべての数値の合計を表示する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン