R中的OO编程风格对Python程序员来说是否可读?

mar*_*omo 15 oop coding-style r

我是CRAN 上的日志包的作者,我不认为自己是R程序员,所以我试图尽可能地使它与Python标准日志包代码兼容,但现在我有一个问题.我希望它能让我有机会学习更多的R!

它是关于分层记录器的.在Python中我会创建一个记录器并发送它记录记录:

l = logging.getLogger("some.lower.name")
l.debug("test")
l.info("some")
l.warn("say no")
Run Code Online (Sandbox Code Playgroud)

在我的R包中,您不创建向其发送消息的记录器,您可以调用一个函数,其中一个参数是记录器的名称.就像是

logdebug("test", logger="some.lower.name")
loginfo("some", logger="some.lower.name")
logwarn("say no", logger="some.lower.name")
Run Code Online (Sandbox Code Playgroud)

问题是每次要向其发送日志消息时都必须重复记录器的名称.我在想,我可能会创建一个部分应用的函数对象并调用它,例如

logdebug <- curry(logging::logdebug, logger="some.lower.logger")
Run Code Online (Sandbox Code Playgroud)

但是我需要为所有调试功能这样做......

您的R用户将如何处理此问题?

Mar*_*gan 27

听起来像参考课的工作?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", ...) }
                    ))
Run Code Online (Sandbox Code Playgroud)

然后

> 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
> 
Run Code Online (Sandbox Code Playgroud)