Menu
Coddy logo textTech

Fonksiyon Döndürme

Coddy'nin R Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 29 / 64.

Bir işlev ayrıca bir işlev döndürebilir. make_multiplier(3), bağımsız değişkenini 3 ile çarpan yeni bir işlev döndürür:

make_multiplier <- function(n) {
  function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))

Çıktı:

[1] 15
[1] 50

Döndürülen işlev, oluşturulurken kendisine verilen değerleri hatırlar. Bir işlev ile onu çevreleyen değişkenlerin bu birleşimine closure adı verilir. Üreticiye yapılan her çağrı ayrı bir closure oluşturur:

make_greeter <- function(greeting) {
  function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))

Çıktı:

[1] "Hello, Ada!"
[1] "Hola, Ada!"

Bir üretici işlevi, birkaç ayarı kullanıma hazır bir araca dönüştürür; örneğin birimler arasında dönüşüm yapan bir araç:

make_converter <- function(factor, offset = 0) {
  function(x) x * factor + offset
}
c_to_f <- make_converter(1.8, 32)
km_to_miles <- make_converter(0.621)
print(c_to_f(100))
print(km_to_miles(10))

Çıktı:

[1] 212
[1] 6.21

Fonksiyonlar yeni fonksiyonlar oluşturmak üzere birleştirilebilir. compose(f, g), önce f ve ardından g işlevini çalıştıran bir fonksiyon döndürür:

compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean("  hi there "))

Çıktı:

[1] "HI THERE"
challenge icon

Görev

Kolay

make_formatter(prefix, digits) işlevini tamamla. Bir sayı alan ve prefix ile ardından digits ondalık basamaklı sayıyı döndüren bir işlev döndürür: make_formatter("$", 2)(3.5), $3.50 döndürür.

sprintf("%.*f", digits, x), x değerini digits ondalık basamakla biçimlendirir.

Sağlanan kod, prefix'i, ondalık basamak sayısını ve virgülle ayrılmış bir sayı listesini okur. Bir biçimlendirici oluşturur ve her sayı için sonucunu yazdırır.

Kendin dene

make_formatter <- function(prefix, digits) {
  # Kodunuzu buraya yazın
  function(x) ""
}

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input <- suppressWarnings(readLines(file("stdin")))
fmt <- make_formatter(input[1], as.integer(input[2]))
for (x in as.numeric(strsplit(input[3], ",")[[1]])) cat(fmt(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.

Mantık ve Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi