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 başka bir işlev de 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 fonksiyon, oluşturulurken aldığı değerleri hatırlar. Bir fonksiyon ile etrafındaki değişkenlerin bu birleşimine closure denir. Oluşturucu fonksiyonun her çağrısı 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 oluşturucu işlev, birkaç ayarı kullanıma hazır bir araca dönüştürür; örneğin, birimler arasında dönüşüm yapan bir araca:
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 birleştirilerek yeni fonksiyonlar oluşturulabilir. compose(f, g), önce f sonra da 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 değerinin ardından sayıyı digits ondalık basamakla 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; öneki, ondalık basamak sayısını ve virgülle ayrılmış bir sayı listesini okur. Tek 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