`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
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şlarBir 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 ;)
Nasıl Apache 2.2 için büyü etkinleştir...
Nasıl büyü php etkin olup olmadığını k...
Nasıl Apache büyü hata ayıklama...
.debug yeniden dizin dışlamak için nas...
Nasıl'In İPython büyü %yapıştır i...