2011-02-10 12 views
14

CRAN'da logging package'un yazarıyım, kendimi bir R programcısı olarak görmüyorum, bu yüzden Python standard logging package ile kod uyumlu olarak yapmaya çalıştım, ama şimdi bir sorum var. ve umarım bana daha fazla R öğrenme şansı verir!, R'deki OO programlama stili bir Python programlayıcısına okunabilir mi?

, hiyerarşik kaydedicilerle ilgilidir. Python ben günlüğü kayıtları bir logger oluşturmak ve göndermek olacaktır:

Benim R pakette
l = logging.getLogger("some.lower.name") 
l.debug("test") 
l.info("some") 
l.warn("say no") 

yerine size mesaj göndermek için bir logger değilsiniz, argümanları biri adıdır bir işlevi çağırmak logger.

logdebug("test", logger="some.lower.name") 
loginfo("some", logger="some.lower.name") 
logwarn("say no", logger="some.lower.name") 

sorun gibi bir şey logger adı onu bir kayıt mesajı göndermek istediğiniz her zaman tekrarlamak zorunda olmasıdır. Kullanıcıların bu yaklaşım R nasıl

... Ben

logdebug <- curry(logging::logdebug, logger="some.lower.logger") 

gibi, ben de kısmen uygulanan fonksiyon nesnesi oluşturmak ve bunun yerine çağırabilir, bir şey düşünüyordum ama sonra tüm hata ayıklama işlevleri için bunu yaparken gerek ?

+0

Çocuklar, küçük kütüphaneme gereksinim ekleyerek iki ilginç cevap aldım. uzun vadede, ben 'ReferenceClasses' dayalı birini tercih düşünüyorum, ama kısa vadede 'proto' R2.11 kullanmamı sağlar ... – mariotomo

cevap

27

bir referans sınıfına ?setRefClass için bir iş gibi ?ReferenceClasses

Logger <- setRefClass("Logger", 
        fields=list(name = "character"), 
        methods=list(
        log = function(level, ...) 
          { levellog(level, ..., logger=name) }, 
        debug = function(...) { log("DEBUG", ...) }, 
        info = function(...) { log("INFO", ...) }, 
        warn = function(...) { log("WARN", ...) }, 
        error = function(...) { log("ERROR", ...) } 
        )) 

ve sonra

> basicConfig() 
> l <- Logger$new(name="hierarchic.logger.name") 
> l$debug("oops") 
> l$info("oops") 
2011-02-11 11:54:05 NumericLevel(INFO):hierarchic.logger.name:oops 
> l$warn("oops") 
2011-02-11 11:54:11 NumericLevel(WARN):hierarchic.logger.name:oops 
> 
+0

Bu soruyu izleyen bir [soru] (http://stackoverflow.com/questions/5140447) var ... – mariotomo

+0

Ben sadece sözdizimsel şeker için referans sınıflarını kullanarak düşünüyorum kötü bir fikir çünkü bu, akıl yürütme hakkında daha da zorlaştırıyor. İşlevlerin bir listesini döndürerek aynı işlevselliği kaldırabilirsiniz. – hadley

+0

@hadley Bunu, 'logger' kavramını sözdizimsel şekerden ziyade referans semantiği ile hizalayarak gördüm. –

1

Neden adı tekrarlıyorsunuz? Işlevi doğrudan log-nesnesi geçirmek için daha uygun bir tek fonksiyonların bir dizi bağlantı kullanmak yol bit

logdebug("test",logger=l) 
# or 
logdebug("test",l) 

yani olacaktır. Bu sanırım daha çok R yolu gibi görünüyor.

+0

Kaydedici ilk parametre olarak daha fazla R-ish olabilir Might ve daha sonra logdebug, logger sınıfı için bir yöntemdir. – Spacedman

+0

@Spacedman: Ben de öyle diyebilirim, ama OP yapısına mümkün olduğunca yakın tuttum. Yine de S4 ile daha kolay olurdu. –

+5

"S4 ile daha kolay olurdu" - ünlü son sözler: P – hadley

3

Bu proto paketi ile yapılabilir geliyor. Gelen

> basicConfig() 
> l <- Logger.$new(name = "hierarchic.logger.name") 
> l$warn("this may be bad") 
2011-02-28 10:17:54 WARNING:hierarchic.logger.name:this may be bad 
> l$error("this definitely is bad") 
2011-02-28 10:17:54 ERROR:hierarchic.logger.name:this definitely is bad 

: Bu Ar eski sürümlerini (onun etrafında yıldır) destekleyen yüzden R. vs eski yeni versiyonlarının bir sorun olmazdı

library(proto) 
library(logging) 

Logger. <- proto(
     new = function(this, name) 
      this$proto(name = name), 
     log = function(this, ...) 
      levellog(..., logger = this$name), 
     setLevel = function(this, newLevel) 
      logging::setLevel(newLevel, container = this$name), 
     addHandler = function(this, ...) 
      logging::addHandler(this, ..., logger = this$name), 
     warn = function(this, ...) 
      this$log(loglevels["WARN"], ...), 
     error = function(this, ...) 
      this$log(loglevels["ERROR"], ...) 
) 
basicConfig() 
l <- Logger.$new(name = "hierarchic.logger.name") 
l$warn("this may be bad") 
l$error("this definitely is bad") 

Bu çıktıyı verir Yukarıdaki protokolde sadece protokolün üst katmanında prototip var, ancak her bir loglama nesnesini bir proto-nesnesine dönüştürmek mümkün olacaktı, yani her ikisi de olacaktı, çünkü hem log hem de cis nesneleri R ortamları. Bu ekstra katmandan kurtulacaktı.

Daha fazla bilgi için http://r-proto.googlecode.com'a bakın.

+0

Gabor, [R paketini isteğe bağlı bağımlılıklar ile dağıtma] (http://stackoverflow.com/questions/5140447) sorusunu kaldırmak istiyorum, ancak burada yararlı olan bir yanıt eklediniz. Buradan buraya taşıdıysanız, tüm dRpwod sorusunu kaldıracağım. Hareketi kendim yapmaya çalıştım, ancak düzenlemelerim reddedildi. – mariotomo

+0

Bir sil düğmesi var, ancak gönderiyi silmek görünmüyor. Silmek için oy vermek istiyorsam sadece bana soruyor. Gönderiyi taşıdım ve bunu yenisine işaretçisiyle değiştirdim. –

+0

Bu cevabı düzenleyebilir ve diğer cevabın metnini buraya yapıştırabilir misiniz? Diğer bütün soruların daha sonra kaldırılması için (oylama için oy kullanacağım). – mariotomo

İlgili konular