Menu
Coddy logo textTech

Varsayılan Metotlar

Coddy'nin R Journey'sinin Nesne Tabanlı Programlama bölümünün bir parçası. Ders 8 / 57.

Hiçbir yöntem sınıfla eşleşmediğinde, UseMethod() varsayılan yöntemi olan name.default'u arar. Bu, generic'in bilmediği her sınıf için geri dönüş yöntemidir:

describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
describe.default <- function(x) "something I do not know"
rex <- structure(list(name = "Rex"), class = "dog")
car <- structure(list(), class = "car")
print(describe(rex))
print(describe(car))

Çıktı:

[1] "a dog called Rex"
[1] "something I do not know"

Varsayılan bir yöntem olmadan, bilinmeyen bir sınıf üzerinde jenerik işlevi çağırmak bir hatayla durur:

describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)

Çıktı:

Error in UseMethod("describe") : 
  no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution halted

Düz değerler de gönderim yapar. Sınıf özniteliği olmayan bir sayı örtük sınıf olarak numeric değerine, metin character değerine ve TRUE ise logical değerine sahiptir; bu nedenle bu adlara sahip metotlar sıradan vektörler üzerinde çalışır:

describe <- function(x) UseMethod("describe")
describe.numeric <- function(x) paste("numbers adding up to", sum(x))
describe.character <- function(x) paste("words:", paste(x, collapse = " "))
describe.default <- function(x) "something else"
print(describe(c(1, 2, 3)))
print(describe(c("a", "b")))
print(describe(TRUE))

Çıktı:

[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"

Varsayılan bir yöntem de kibarca reddedebilir: çağıranın neyin yanlış gittiğini bilmesi için sınıfı belirten bir iletiyle stop(). class(x)[1], nesnenin ilk sınıfıdır:

area <- function(shape) UseMethod("area")
area.square <- function(shape) shape$side^2
area.default <- function(shape) {
  stop("cannot compute the area of a ", class(shape)[1], call. = FALSE)
}
for (s in list(structure(list(side = 2), class = "square"), structure(list(), class = "blob"))) {
  cat(tryCatch(area(s), error = function(e) conditionMessage(e)), "\n")
}

Çıktı:

4 
cannot compute the area of a blob 
challenge icon

Görev

Kolay

Genel describe(x) işlevini ve düz vektörler için yöntemlerini Describe.R içinde tamamla:

  • describe.numeric(), 3 numbers, sum 6 döndürür.
  • describe.character(), 2 words, longest: apple döndürür (eşitlik durumunda en uzun sözcüklerin ilkini).
  • describe.logical(), 2 of 3 are TRUE döndürür.
  • describe.default(), something else döndürür.

Sağlanan kod, satırları num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE veya değerler içeren başka herhangi bir sözcük biçiminde okur ve bunları bir listeye dönüştürür. Her biri için describe() çıktısını yazdırır.

Kodun Describe.R içinde yer almalıdır. main.R, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Describe.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  values <- strsplit(p[2], ",")[[1]]
  x <- switch(p[1],
    num = as.numeric(values),
    chr = values,
    lgl = as.logical(values),
    list(values))
  cat(describe(x), "\n", sep = "")
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Tabanlı Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi