Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop R中的哪个OO编程风格对Python程序员来说是可读的?_Oop_R_Coding Style - Fatal编程技术网

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

Oop R中的哪个OO编程风格对Python程序员来说是可读的?,oop,r,coding-style,Oop,R,Coding Style,我是《OnCran》一书的作者,我不认为自己是一个R程序员,所以我试图尽可能使它的代码兼容,但现在我有一个问题。我希望这能给我更多的机会去学习R 这是关于分层伐木者的。在Python中,我将创建一个记录器并向其发送日志记录: l = logging.getLogger("some.lower.name") l.debug("test") l.info("some") l.warn("say no") 在MyR包中,您不创建向其发送消息的记录器,而是调用一个函数,其中一个参数是记录器的名称。差不

我是《OnCran》一书的作者,我不认为自己是一个R程序员,所以我试图尽可能使它的代码兼容,但现在我有一个问题。我希望这能给我更多的机会去学习R

这是关于分层伐木者的。在Python中,我将创建一个记录器并向其发送日志记录:

l = logging.getLogger("some.lower.name")
l.debug("test")
l.info("some")
l.warn("say no")
在MyR包中,您不创建向其发送消息的记录器,而是调用一个函数,其中一个参数是记录器的名称。差不多

logdebug("test", logger="some.lower.name")
loginfo("some", logger="some.lower.name")
logwarn("say no", logger="some.lower.name")
问题是,每次要向记录器发送日志消息时,都必须重复记录器的名称。我在想,我可能会创建一个部分应用的函数对象并调用它,比如

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

logdebug为什么要重复这个名称?将日志对象直接传递给函数会更方便,即

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

有点像在许多函数中使用连接的方式。我想这似乎更像是一种更简单的方式

听起来像是参考类的作业
?setRefClass
?referenceclass

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", ...) }
                    ))
记录器基本配置()
>l$debug(“oops”)
>l$info(“oops”)
2011-02-11 11:54:05数字级别(信息):层次结构记录器名称:oops
>l$warn(“oops”)
2011-02-11 11:54:11 NumericLevel(警告):层次结构记录器。名称:oops
> 

这可以通过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")
库(proto)
库(日志)
记录器。l$warn(“这可能很糟糕”)
2011-02-28 10:17:54警告:层次结构记录器名称:这可能不好
>l$错误(“这肯定很糟糕”)
2011-02-28 10:17:54错误:hierarchic.logger.名称:这绝对是不好的
在上面的例子中,我们只是在日志记录之上分层了proto,但是可以将每个日志记录对象转换为proto对象,即,它将同时是proto对象,因为日志记录对象和proto对象都是R环境。这样就可以去掉多余的一层


有关详细信息,请参阅。

将记录器作为第一个参数,然后logdebug是logger类的一个方法,这可能更为严格。@Spacedman:我也这么说,但我尽可能接近OPs构造。不过,使用S4会更容易。“使用S4会更容易”-著名的遗言:P@Hadley:好的,你让我明白了。:-)(我的意思是把Loggor作为第一个参数会使S4更容易……或者更少痛苦……)另一个问题是S4的,但是对于Python、java和C++的人来说更容易理解。无论如何,我会按照你的提示去做,我会读更多关于S4的内容。谢谢大家!下面我有一个答案…我认为使用引用类只是为了进行语法分析是个坏主意,因为这会使代码更难推理。您可以通过返回函数列表来实现相同的功能。@hadley我认为这是将“记录器”的概念与引用语义对齐,而不是语法糖。但您实际上并没有修改任何内容,这使得引用语义的使用变得毫无意义。我本以为记录器会写入(即修改)一个连接,例如,磁盘上的文件。Gabor,我想删除这个问题,但是你在这里附上了一个有用的答案。如果你把它从那里移到这里,我会把整个dRpwod问题去掉。我试图自己移动,但我的编辑被拒绝。有一个删除按钮,但似乎无法删除帖子。它只问我是否想投票删除它。我已经移动了帖子,并用指向新帖子的指针替换了这个帖子。你能编辑这个答案并将另一个答案的文本粘贴到这里吗?然后我将删除(投票赞成删除)另一个完整的问题。我试图将proto添加到日志记录包中,但没有成功。毕竟参考类更容易使用。伙计们,我收到了两个有趣的答案,这两个答案都为我的小图书馆增加了需求。从长远来看,我想我更喜欢基于
参考类
,但从短期来看
proto
允许我使用R2.11。。。
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