슬롯과 접근
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 37slot(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 haltedgetSlots()는 선언된 유형과 함께 모든 슬롯 이름을 반환하므로, 코드는 텍스트 입력을 슬롯이 예상하는 유형으로 변환할 수 있습니다:
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챌린지
쉬움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 = "")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 R 컴파일러