使用可选的依赖项分发R包

时间:2011-02-28 09:56:17

标签: r software-distribution

我写了small package for logging,我通过r-forge分发它,最近我收到some very interesting feedback关于如何使它更容易使用,但这个功能是基于东西({ {1}})在2.12中添加到R中。

我还想继续为R-2.11分发包,所以我正在寻找一种方法来自动包含或排除S4语法糖,并在R> =上加载库时包括它2.12系统。

我看到的另一个选项,就是编写一个需要2.12的小型S4包,导入更简单的setRefClass包并导出语法上含糖的界面......我不太喜欢它,因为我需要为S4包选择不同的名称。


谢谢你,Gabor提供了一种避免这种需求的方法,但问题仍然存在。

1 个答案:

答案 0 :(得分:3)

这可以通过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