S4 클래스 정의
Coddy R 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 22번째.
S4는 R의 공식 객체 시스템입니다. setClass()는 이름이 지정된 슬롯과 각 슬롯의 유형을 사용하여 클래스를 선언하고, new()는 객체를 생성합니다. @ 연산자는 슬롯을 읽습니다:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)출력:
Ada is 36setClass()는 생성기 함수도 반환합니다. 이를 이름(일반적으로 클래스 이름)에 할당하고 생성자처럼 호출하세요:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))출력:
[1] 8
[1] TRUES3와 달리 R은 슬롯을 검사합니다. 알 수 없는 슬롯이나 잘못된 유형의 값이 있으면 new()가 오류와 함께 중단되므로 S4 객체는 항상 클래스에서 선언한 형태를 가집니다:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")출력:
Error in validObject(.Object) :
invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution halted지정되지 않은 슬롯에는 character(0)과 같이 해당 유형의 빈 값이 할당됩니다. prototype은 대신 실제 기본값을 설정합니다. 이전 코드는 representation()을 사용하여 슬롯을 선언하며, 이는 slots와 같은 의미입니다:
setClass("Task", slots = c(title = "character", done = "logical"),
prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))출력:
[1] FALSE
[1] 0챌린지
쉬움Book.R에서 세 개의 슬롯을 가진 S4 클래스 Book을 선언하세요. title과 author의 타입은 character이고, pages의 타입은 numeric이어야 합니다. 그런 다음 @을 사용해 슬롯을 읽고 Dune by Frank Herbert (412 pages)를 반환하는 book_label(b)을 완성하세요.
제공된 코드는 title;author;pages 형식의 줄을 읽고, new("Book", ...)을 사용해 각 책을 생성한 후 레이블을 출력하고, 마지막으로 클래스의 슬롯 이름을 출력합니다.
여러분의 코드는 Book.R에 작성하세요. main.R에는 제공된 입출력 코드가 들어 있으며 수정할 수 없습니다.
직접 해보기
source("Book.R")
# 제공된 입력/출력 코드: 있는 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\n", sep = "")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 R 컴파일러