Menu
Coddy logo textTech

슬롯과 접근

Coddy R 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 23번째.

obj@slot <- value는 슬롯을 변경합니다. S3 객체와 마찬가지로 S4 객체는 값입니다. 하나를 변경하는 함수는 자체 복사본에서 작동하고 그 복사본을 반환합니다:

setClass("Person", slots = c(name = "character", age = "numeric"))
birthday <- function(p) {
  p@age <- p@age + 1
  p
}
ada <- new("Person", name = "Ada", age = 36)
older <- birthday(ada)
cat(ada@age, older@age)

출력:

36 37

slot(obj, "name")은 문자열로 슬롯 이름을 지정한 @과 동일하게 작동하므로, 변수에 저장된 이름과 함께 사용할 수 있습니다. slotNames()는 클래스 또는 객체의 슬롯을 나열합니다:

setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
for (s in slotNames(ada)) cat(s, "=", format(slot(ada, s)), "\n")
slot(ada, "age") <- 37
print(ada@age)

출력:

name = Ada 
age = 36 
[1] 37

모든 할당은 new()뿐만 아니라 선언된 형식에 따라 검사됩니다. 잘못된 값은 거부되고 객체는 기존 값을 유지합니다:

setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
ada@age <- "old"

출력:

Error in (function (cl, name, valueClass)  : 
  assignment of an object of class “character” is not valid for @‘age’ in an object of class “Person”; is(value, "numeric") is not TRUE
Execution halted

getSlots()는 선언된 유형과 함께 모든 슬롯 이름을 반환하므로, 코드는 텍스트 입력을 슬롯이 예상하는 유형으로 변환할 수 있습니다:

setClass("Person", slots = c(name = "character", age = "numeric"))
types <- getSlots("Person")
print(types)
value <- "40"
if (types[["age"]] == "numeric") value <- as.numeric(value)
print(value + 1)

출력:

       name         age 
"character"   "numeric" 
[1] 41
challenge icon

챌린지

쉬움

Profile.R의 Profile 클래스에는 name과 city(문자형), age(숫자형) 슬롯이 있습니다. 두 함수를 완성하세요:

  • update_profile(p, field, value)는 해당 필드가 슬롯이 아닐 때 no field email과 함께 중지합니다(call. = FALSE 사용). 그렇지 않으면 슬롯이 숫자형일 때 텍스트 value를 as.numeric()으로 변환하고, slot()으로 슬롯을 설정한 다음 변경된 프로필을 반환합니다.
  • profile_lines(p)는 슬롯 순서대로 슬롯마다 한 줄을 반환합니다: name: Ada.

제공된 코드는 이름을 읽은 다음 city=Paris 또는 age=36 형식의 줄을 읽고, 각각을 적용한 뒤 프로필의 줄을 출력합니다.

코드는 Profile.R에 작성하세요. main.R에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.

직접 해보기

source("Profile.R")

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
p <- new("Profile", name = input[1], city = "unknown", age = 0)
for (line in input[-1]) {
  kv <- strsplit(line, "=")[[1]]
  p <- tryCatch(update_profile(p, kv[1], kv[2]), error = function(e) {
    cat("error: ", conditionMessage(e), "\n", sep = "")
    p
  })
}
for (l in profile_lines(p)) cat(l, "\n", sep = "")
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 R 컴파일러