Это можно сделать с помощью пакета proto. Это поддерживает более старые версии R (это было в течение многих лет), поэтому у вас не будет проблемы старых и новых версий R.
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")
Это дает вывод:
> 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
В приведенном выше примере мы просто наложили прототип поверх логирования, но можно было бы превратить каждый регистрируемый объект в прототип, т. Е. Это было бы и то и другое, поскольку и объекты логирования, и объекты прото являются средами R. Это избавило бы от лишнего слоя.
Подробнее см. http://r -proto.googlecode.com .