9.5 리스트 요소 접근
리스트는 벡터와 유사한 방식으로 액세스할 수 있습니다. 색인에 정수형, 논리형 또는 문자형 벡터를 사용할 수 있습니다. 또한 이 접근 방식에 의해 접근된 요소를 변수에 할당하면 리스트의 서브 세팅도 이루어 지는 것입니다.
# 벡터, 행렬 그리고 리스트로 구성되는 리스트를 생성합니다.
<- list(c("Jan","Feb","Mar"), matrix(c(3,9,5,1,-2,8), nrow = 2),
list_data list("green",12.3))
# 리스트의 요소에 이름을 부여합니다.
names(list_data) <- c("1st Quarter", "A_Matrix", "A Inner list")
## 리스트 요소의 정수형 색인을 이용한 접근의 예입니다.
1] # 리스트의 1번째 요소에 접근합니다. list_data[
## $`1st Quarter`
## [1] "Jan" "Feb" "Mar"
3] # 리스트의 3번째 요소에 접근합니다. list_data[
## $`A Inner list`
## $`A Inner list`[[1]]
## [1] "green"
##
## $`A Inner list`[[2]]
## [1] 12.3
c(1, 3)] # 리스트의 1번째, 3번째 요소에 접근합니다. list_data[
## $`1st Quarter`
## [1] "Jan" "Feb" "Mar"
##
## $`A Inner list`
## $`A Inner list`[[1]]
## [1] "green"
##
## $`A Inner list`[[2]]
## [1] 12.3
-2] # 리스트의 2번째 요소를 제외하고 접근합니다. list_data[
## $`1st Quarter`
## [1] "Jan" "Feb" "Mar"
##
## $`A Inner list`
## $`A Inner list`[[1]]
## [1] "green"
##
## $`A Inner list`[[2]]
## [1] 12.3
## 논리형 벡터를 색인으로 이용한 접근의 예입니다.
c(T, F, F)] # T에 해당하는 1번째 요소만 접근합니다. list_data[
## $`1st Quarter`
## [1] "Jan" "Feb" "Mar"
## 리스트 요소의 이름을 이용한 접근의 예입니다.
$A_Matrix # $ 연산자를 이용하여 A_Matrix 요소에 접근합니다. list_data
## [,1] [,2] [,3]
## [1,] 3 5 -2
## [2,] 9 1 8
"A_Matrix"] # []를 이용하여 A_Matrix 요소에 접근합니다. list_data[
## $A_Matrix
## [,1] [,2] [,3]
## [1,] 3 5 -2
## [2,] 9 1 8
$`A Inner list` # $ 연산자를 이용하는 경우 이름에 공란이 있는 경우 ``를 이용합니다. list_data
## [[1]]
## [1] "green"
##
## [[2]]
## [1] 12.3
"`A Inner list`"] ### []를 이용한 경우에는 공란이 있는 이름은 접근이 안됩니다. list_data[
## $<NA>
## NULL
$`A Inner list`[[1]] # `A Inner list`의 첫 번째 요소 데이터를 출력합니다. list_data
## [1] "green"
$`A Inner list`[[2]] # `A Inner list`의 두 번째 요소 데이터를 출력합니다. list_data
## [1] 12.3
위와 같이 [
로 인덱싱하면 구성 요소 내부의 콘텐츠가 아닌 하위 리스트가 제공됩니다. 구체적인 데이터 값을 검색하려면 [[
을 이용합니다. 그러나 이 접근 방식을 사용하면 한 번에 하나의 구성 요소에만 액세스 할 수 있습니다.
"A_Matrix"] # A_Matrix를 리스트 형태로 반환합니다. list_data[
## $A_Matrix
## [,1] [,2] [,3]
## [1,] 3 5 -2
## [2,] 9 1 8
typeof(list_data["A_Matrix"]) # 리스트 형임을 확인할 수 있습니다.
## [1] "list"
"A_Matrix"]] # A_Matrix의 실제 데이터인 행렬을 반환합니다. list_data[[
## [,1] [,2] [,3]
## [1,] 3 5 -2
## [2,] 9 1 8
typeof(list_data[["A_Matrix"]]) # double 형임을 확인할 수 있습니다.
## [1] "double"
지금까지 살펴본 바와 같이 리스트의 내용에 액세스하는 동안 자주 사용되는 [[
의 대안은 $
연산자입니다. $
는 태그에서 부분 일치를 수행할 수 있다는 점을 제외하면 둘 다 동일합니다.
여기에서 태그의 부분일치의 예를 들면 다음과 같습니다.
<- list(name = c("Kim", "Lee", age = c(20, 30))
x $n # x$name이 출력됨을 알 수 있습니다. 즉, n이 name에 부분일치한 것입니다.
x$a # x$age가 출력됨을 알 수 있습니다.
x"n"] # $ 연산자는 키워드의 부분일치를 허용하지만, []는 부분일치를 허용하지 않습니다.
x["n"]] # $ 연산자는 키워드의 부분일치를 허용하지만, [[]]는 부분일치를 허용하지 않습니다.
x[[
# $ 연산자를 이용한 접근은 그 요소의 데이터 유형으로 접근이 됩니다.
$name # 문자형 벡터로 출력됨을 알 수 있습니다.
x
# 다음과 같이 []의 사용과 [[]]의 차이점을 확인할 필요가 있습니다.
"name"][1] # name 요소를 리스트로 접근하여 그에 대한 첫번째 요소를 리스트로 출력합니다.
x["name"]][1] # name 요소의 문자형 벡터로 접근하여 그에 대한 첫번째 요소를 문자열로 출력합니다. x[[
## Error: <text>:2:1: 예상하지 못한 기호(symbol)입니다.
## 1: x <- list(name = c("Kim", "Lee", age = c(20, 30))
## 2: x
## ^
[]]와 [[ ]]의 차이 : 왼쪽에서 오른쪽 방향으로 파악하면 도움이 됩니다.
[]
: [] 안의 키워드 요소에 접근하여 리스트로 출력을 합니다.
[[]]
: [[]] 안의 키워드 요소에 접근하여 벡터로 출력을 합니다.
[][]
: 왼쪽의 [] 안의 키워드 요소가 리스트로 접근이 되고, 그 다음의 오른쪽 [] 안의 키워드 요소를 리스트로 출력합니다.
[][[]]
: 왼쪽의 [] 안의 키워드 요소가 리스트로 접근이 되고, 그 다음의 오른쪽 [] 안의 키워드 요소를 벡터로 출력합니다.
[[]][]
: 왼쪽의 [[]] 안의 키워드 요소가 벡터로 접근이 되고, 그 다음의 오른쪽 [[]] 안의 키워드 요소에 대해 벡터 요소로 출력합니다.