SORU
4 Mayıs 2012, Cuma


`düzeyleri<-`( nasıl bir büyü bu?

Başka bir cevap söz konusu, @Marek yayınlanan aşağıdaki çözüm: http://stackoverflow.com/a/10432263/636656

dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L, 
                                  7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA, -20L), class = "data.frame")

`levels<-`(
  factor(dat$product),
  list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
  )

Çıkış olarak üretir:

 [1] Generic Generic Bayer   Bayer   Advil   Tylenol Generic Advil   Bayer   Generic Advil   Generic Advil   Tylenol
[15] Generic Bayer   Generic Advil   Bayer   Bayer  

Bu sadece bir vektör çıktı, bunu saklamak için daha da kafa karıştırıcı yapabilirsiniz:

res <- `levels<-`(
  factor(dat$product),
  list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
  )

Açıkçası bu düzeyde işlev çağrısı bir tür, ama burada neler yapılıyor hiçbir fikrim yok. Büyücülük bu tür için kullanılan terim nedir ve nasıl bu alanda benim sihirli yeteneğini arttırmak mı?

CEVAP
8 Mayıs 2012, Salı


Cevaplar burada iyi, ama önemli bir nokta eksik. Çalışayım tarif.

R fonksiyonel bir dildir ve nesneleri mutasyona gibi değil. Ama atama deyimleri, yedek işlevlerini kullanma izin vermiyor:

levels(x) <- y

olur denk

x <- `levels<-`(x, y)

Hüner, bu yeniden yazma <-; levels<- tarafından yapılmaz tarafından yapılır. levels<- bir girdi alır ve bir çıkış; her şey değişmek değil veren sıradan bir fonksiyonudur.

Bu, yukarıdaki kural, <- göre bunun bir sonucu da özyinelemeli olması gerekir:

levels(factor(x)) <- y

factor(x) <- `levels<-`(factor(x), y)

x <- `factor<-`(x, `levels<-`(factor(x), y))

Saf ve işlevsel dönüşüm (atama olur sonuna kadar) atama zorunlu bir dil olur ne eşdeğer olan farklı bir güzelliği var. Eğer yanlış hatırlamıyorsam bu fonksiyonel dil yapısı mercek denir.

Ama sonra, bir zamanlar tanımlanan değiştirme fonksiyonları gibi levels<-, bir, beklenmedik bir düşeş: sen sadece inat etmek, ödevleri yapmak, kullanışlı bir özellik bu alır bir faktör, ve dışarı verir, başka bir faktör ile farklı düzeylerde. Gerçekten bir şey yok "atama" hakkında.

Yani, bahsettiğin kod sadece levels<- diğer yoruma kullanmasıdır. 22 ** adını bir görev önerir, çünkü biraz kafa karıştırıcı olduğunu kabul ediyorum, ama bu değil. Kodu sadece potansiyel bir tür kurma

  • dat$product ile başlar

  • Bir faktör dönüştürmek

  • Düzeyleri değiştirin

  • res kaybolmaz

Kişisel olarak, bir kod satırı çok güzel olduğunu düşünüyorum ;)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Doc Adams

    Doc Adams

    20 HAZİRAN 2007
  • Huot Media

    Huot Media

    7 Mayıs 2010
  • Paulo Bautista

    Paulo Bautis

    21 Aralık 2008