リスト要素へのアクセス
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番目の要素にアクセスします。覚えておいてください:実際のコンテンツが必要な場合には [[ ]] を使用し、より小さなリストが必要な場合には [ ] を使用します。
チャレンジ
簡単2行の入力が与えられます:
- 異なる型の3つのカンマ区切り値(例:
100,hello,TRUE) - 4番目の要素として格納される、ベクトルを表すカンマ区切りの数値リスト(例:
5,10,15,20)
以下の操作を実行してください:
- 数値、テキスト、論理値、および数値ベクトルの4つの要素を持つリストを作成します。
- 二重ブラケットを使用して、2番目の要素(テキスト値)を抽出して出力します。
- 一重ブラケットを使用して3番目の要素を抽出し、結果を出力します(出力形式の違いに注意してください)。
- 二重ブラケットを使用して4番目の要素に格納されているベクトルにアクセスし、ベクトルインデックスを使用してその3番目の値を抽出して出力します。
- 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番目の要素に含まれるすべての数値の合計を表示するこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。