распространение пакета R с необязательными зависимостями - PullRequest
3 голосов
/ 28 февраля 2011

Я написал небольшой пакет для регистрации , я распространяю его через r-forge, недавно я получил несколько очень интересных отзывов о том, как сделать его проще в использовании, но эта функциональность основана на материале (setRefClass), который был добавлен в R в 2.12.

Я хотел бы продолжить распространение пакета также для R-2.11, поэтому я ищу способвключить или исключить синтаксический сахар S4 автоматически и включить его, когда библиотека загружается в систему с R> = 2.12.

я вижу еще один вариант - написать небольшой пакет S4, для которого требуется 2.12,импортирует более простой пакет logging и экспортирует синтаксически подслащенный интерфейс ... Мне он не очень нравится, так как мне нужно было бы выбрать другое имя для пакета S4.


спасибоВы, Габор, за то, что предложили способ избежать этой необходимости, но вопрос все еще открыт.

1 Ответ

3 голосов
/ 28 февраля 2011

Это можно сделать с помощью пакета 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 .

...