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] 50Dö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.21Fonksiyonlar 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"Görev
Kolaymake_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 = "")
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
1Dizeleri Derinlemesine
substr() ile Alt Dizelersprintf() ile BiçimlendirmeBölme ve BirleştirmeDizelerde AramaMetin DeğiştirmeTekrar - Kullanıcı Adı Oluşturucu4Matrisler
Matris OluşturmaMatrisleri İndekslemeSatır ve Sütun ÖzetleriMatris AritmetiğiTekrar - Oturma Planı2Anahtar-Değer Aramaları
Adlandırılmış Vektör AramalarıAnahtarları DenetlemeAnahtar Ekleme ve KaldırmaAdlar Üzerinde DöngüTekrar - Hisse Senedi Masası5Proje - Not Defteri
Öğrenci EklemeNotları Kaydetme3Kümeler ve Sayma
Benzersiz DeğerlerKüme İşlemleriÜyelik Testleritable() ile SaymaTekrar - Etkinlik Konukları6Değer Olarak Fonksiyonlar
Anonim FonksiyonlarFonksiyonları GeçirmeFonksiyon DöndürmeDurum Bilgili Closure'larTekrar - İndirim Kuralları9Veri Çerçeveleri
Veri Çerçeveleri OluşturmaSütunlar ve SatırlarSatırları FiltrelemeEkleme ve SıralamaTekrar - Satış Raporu12Proje - Harcama Takipçisi
Harcamaları KaydetmeToplam HarcamaKendi başına pratik yap: Online R derleyicisi