Menu
Coddy logo textTech

Print ve Format Metotları

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

Bir değer yazdırıldığında R, print() işlevini çağırır. Sınıf için özel bir şey olmadan, bir S3 nesnesi sınıf özniteliğinin ardından listesini yazdırır; bu da okunmasını zorlaştırır:

m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)

Çıktı:

$amount
[1] 9.5

$currency
[1] "EUR"

attr(,"class")
[1] "money"

Bir metot, generic.class adında bir fonksiyondur. print() sınıfı money olan bir nesne aldığında print.money() fonksiyonunu arar ve bunun yerine onu çağırır. Bir print metodu cat() ile yazdırır ve invisible(x) ile sona erer; böylece nesneyi ikinci kez yazdırmadan geri döndürür:

print.money <- function(x, ...) {
  cat("<money ", x$amount, " ", x$currency, ">\n", sep = "")
  invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)
m

Çıktı:

<money 9.5 EUR>
<money 9.5 EUR>

format() bir değeri metne dönüştürmek için kullanılan geneldir. Bir format.money() yöntemi, metni yazdırmak yerine döndürür; böylece diğer kodlar onu bir cümleye yerleştirebilir ve print yöntemi onu yeniden kullanabilir:

format.money <- function(x, ...) {
  sprintf("%.2f %s", x$amount, x$currency)
}
print.money <- function(x, ...) {
  cat("Money:", format(x), "\n")
  invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
m
cat("You owe", format(m), "\n")

Çıktı:

Money: 9.50 EUR 
You owe 9.50 EUR 

Bir yöntem, genel işleviyle aynı bağımsız değişkenleri alır. print() ve format(), function(x, ...) olarak tanımlandığından, yöntemleri de x, ... ile başlar. ..., çağıranın geçirebileceği digits gibi ek bağımsız değişkenleri kabul eder. Yöntemler, genel işlevin çağrıldığı her yerde çalışır; örneğin vapply() içinde:

format.money <- function(x, ...) sprintf("%.2f %s", x$amount, x$currency)
wallet <- list(
  structure(list(amount = 3, currency = "EUR"), class = "money"),
  structure(list(amount = 0.5, currency = "USD"), class = "money")
)
print(vapply(wallet, format, character(1)))

Çıktı:

[1] "3.00 EUR" "0.50 USD"
challenge icon

Görev

Kolay

new_money(), Money.R dosyasında verilmiştir. Aynı dosyaya iki yöntem ekleyin:

  • format.money(x, ...), miktarı iki ondalık basamak ve para birimiyle birlikte döndürür: 9.50 EUR.
  • print.money(x, ...), format() kullanarak kendi satırında <money 9.50 EUR> yazdırır ve invisible(x) döndürür.

Verilen kod 9.5 EUR satırlarını okur, her para nesnesini yazdırır, ardından tüm biçimlendirilmiş miktarları + ile birleştirerek list: yazdırır.

Kodunuz Money.R dosyasına yazılmalıdır. main.R, verilen girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

source("Money.R")

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
all <- list()
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  m <- new_money(as.numeric(p[1]), p[2])
  print(m)
  all[[length(all) + 1]] <- m
}
cat("list: ", paste(vapply(all, format, character(1)), collapse = " + "), "\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