9.5 리스트 요소 접근

리스트는 벡터와 유사한 방식으로 액세스할 수 있습니다. 색인에 정수형, 논리형 또는 문자형 벡터를 사용할 수 있습니다. 또한 이 접근 방식에 의해 접근된 요소를 변수에 할당하면 리스트의 서브 세팅도 이루어 지는 것입니다.

# 벡터, 행렬 그리고 리스트로 구성되는 리스트를 생성합니다.
list_data <- list(c("Jan","Feb","Mar"), matrix(c(3,9,5,1,-2,8), nrow = 2),
                  list("green",12.3))

# 리스트의 요소에 이름을 부여합니다.
names(list_data) <- c("1st Quarter", "A_Matrix", "A Inner list")

## 리스트 요소의 정수형 색인을 이용한 접근의 예입니다.
list_data[1]           # 리스트의 1번째 요소에 접근합니다.
## $`1st Quarter`
## [1] "Jan" "Feb" "Mar"
list_data[3]           # 리스트의 3번째 요소에 접근합니다.
## $`A Inner list`
## $`A Inner list`[[1]]
## [1] "green"
## 
## $`A Inner list`[[2]]
## [1] 12.3
list_data[c(1, 3)]     # 리스트의 1번째, 3번째 요소에 접근합니다.
## $`1st Quarter`
## [1] "Jan" "Feb" "Mar"
## 
## $`A Inner list`
## $`A Inner list`[[1]]
## [1] "green"
## 
## $`A Inner list`[[2]]
## [1] 12.3
list_data[-2]          # 리스트의 2번째 요소를 제외하고 접근합니다.
## $`1st Quarter`
## [1] "Jan" "Feb" "Mar"
## 
## $`A Inner list`
## $`A Inner list`[[1]]
## [1] "green"
## 
## $`A Inner list`[[2]]
## [1] 12.3
## 논리형 벡터를 색인으로 이용한 접근의 예입니다.
list_data[c(T, F, F)]  # T에 해당하는 1번째 요소만 접근합니다.
## $`1st Quarter`
## [1] "Jan" "Feb" "Mar"
## 리스트 요소의 이름을 이용한 접근의 예입니다.
list_data$A_Matrix             # $ 연산자를 이용하여 A_Matrix 요소에 접근합니다.
##      [,1] [,2] [,3]
## [1,]    3    5   -2
## [2,]    9    1    8
list_data["A_Matrix"]          # []를 이용하여 A_Matrix 요소에 접근합니다.
## $A_Matrix
##      [,1] [,2] [,3]
## [1,]    3    5   -2
## [2,]    9    1    8
list_data$`A Inner list`       # $ 연산자를 이용하는 경우 이름에 공란이 있는 경우 ``를 이용합니다.
## [[1]]
## [1] "green"
## 
## [[2]]
## [1] 12.3
list_data["`A Inner list`"]    ### []를 이용한 경우에는 공란이 있는 이름은 접근이 안됩니다.
## $<NA>
## NULL
list_data$`A Inner list`[[1]]  # `A Inner list`의 첫 번째 요소 데이터를 출력합니다.
## [1] "green"
list_data$`A Inner list`[[2]]  # `A Inner list`의 두 번째 요소 데이터를 출력합니다.
## [1] 12.3

위와 같이 [로 인덱싱하면 구성 요소 내부의 콘텐츠가 아닌 하위 리스트가 제공됩니다. 구체적인 데이터 값을 검색하려면 [[을 이용합니다. 그러나 이 접근 방식을 사용하면 한 번에 하나의 구성 요소에만 액세스 할 수 있습니다.

list_data["A_Matrix"]               # A_Matrix를 리스트 형태로 반환합니다.
## $A_Matrix
##      [,1] [,2] [,3]
## [1,]    3    5   -2
## [2,]    9    1    8
typeof(list_data["A_Matrix"])       # 리스트 형임을 확인할 수 있습니다.
## [1] "list"
list_data[["A_Matrix"]]             # A_Matrix의 실제 데이터인 행렬을 반환합니다.
##      [,1] [,2] [,3]
## [1,]    3    5   -2
## [2,]    9    1    8
typeof(list_data[["A_Matrix"]])     # double 형임을 확인할 수 있습니다.
## [1] "double"

지금까지 살펴본 바와 같이 리스트의 내용에 액세스하는 동안 자주 사용되는 [[의 대안은 $ 연산자입니다. $는 태그에서 부분 일치를 수행할 수 있다는 점을 제외하면 둘 다 동일합니다.

여기에서 태그의 부분일치의 예를 들면 다음과 같습니다.

x <- 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 요소의 문자형 벡터로 접근하여 그에 대한 첫번째 요소를 문자열로 출력합니다.  
## Error: <text>:2:1: 예상하지 못한 기호(symbol)입니다.
## 1: x <- list(name = c("Kim", "Lee", age = c(20, 30))
## 2: x
##    ^

[]]와 [[ ]]의 차이 : 왼쪽에서 오른쪽 방향으로 파악하면 도움이 됩니다.

  • [] : [] 안의 키워드 요소에 접근하여 리스트로 출력을 합니다.

  • [[]] : [[]] 안의 키워드 요소에 접근하여 벡터로 출력을 합니다.

  • [][] : 왼쪽의 [] 안의 키워드 요소가 리스트로 접근이 되고, 그 다음의 오른쪽 [] 안의 키워드 요소를 리스트로 출력합니다.

  • [][[]] : 왼쪽의 [] 안의 키워드 요소가 리스트로 접근이 되고, 그 다음의 오른쪽 [] 안의 키워드 요소를 벡터로 출력합니다.

  • [[]][] : 왼쪽의 [[]] 안의 키워드 요소가 벡터로 접근이 되고, 그 다음의 오른쪽 [[]] 안의 키워드 요소에 대해 벡터 요소로 출력합니다.