哪个OO编程风格在R中会导致可读性给Python程序员? [英] which OO programming style in R will result readable to a Python programmer?
问题描述
我是CRAN的记录软件包的作者,我不认为自己是R程序员,所以我试图使它与代码兼容的 Python标准日志包,但现在我有一个问题。我希望它会给我机会学习一些R!
这是关于分层记录器。在Python中我将创建一个日志记录并发送日志记录:
l = logging.getLogger(some.lower.name )
/ pre>
l.debug(test)
l.info(some)
l.warn(say no)
在我的R包中,而不是创建一个发送消息的记录器,你调用一个函数,其中一个参数是记录器的名称。类似
logdebug(test,logger =some.lower.name)
loginfo ,logger =some.lower.name)
logwarn(say no,logger =some.lower.name)
问题是每次要向记录器发送记录消息时,必须重复记录器的名称。我在想,我可能创建一个部分应用函数对象,并调用,而不是像
logdebug< - curry :: logdebug,logger =some.lower.logger)
但我需要这样做所有调试函数...
你的R用户如何处理这个问题?
解决方案听起来像一个引用类
?setRefClass
,?ReferenceClasses的工作
Logger< - setRefClass(Logger,
fields = list(name =character),
methods = list
log = function(level,...)
{levellog(level,...,logger = name)},
debug = function(...){log ,...)},
info = function(...){log(INFO,...)},
warn = function ,...)},
error = function(...){log(ERROR,...)}
))
,然后
basicConfig()
> l< - Logger $ new(name =hierarchicalic.logger.name)
> l $ debug(oops)
> l $ info(oops)
2011-02-11 11:54:05 NumericLevel(INFO):hierarchicalic.logger.name:oops
> l $ warn(oops)
2011-02-11 11:54:11 NumericLevel(WARN):hierarchicalic.logger.name:oops
>
I'm author of the logging package on CRAN, I don't see myself as an R programmer, so I tried to make it as code-compatible with the Python standard logging package as I could, but now I have a question. and I hope it will give me the chance to learn some more R!
it's about hierarchical loggers. in Python I would create a logger and send it logging records:
l = logging.getLogger("some.lower.name") l.debug("test") l.info("some") l.warn("say no")
In my R package instead you do not create a logger to which you send messages, you invoke a function where one of the arguments is the name of the logger. something like
logdebug("test", logger="some.lower.name") loginfo("some", logger="some.lower.name") logwarn("say no", logger="some.lower.name")
the problem is that you have to repeat the name of the logger each time you want to send it a logging message. I was thinking, I might create a partially applied function object and invoke that instead, something like
logdebug <- curry(logging::logdebug, logger="some.lower.logger")
but then I need doing so for all debugging functions...
how would you R users approach this?
解决方案Sounds like a job for a reference class
?setRefClass
,?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", ...) } ))
and then
> 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 >
这篇关于哪个OO编程风格在R中会导致可读性给Python程序员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!