2017-01-31 13 views
3

Я делаю анализ данных и создал пакет для хранения моих виньет и данных, как объяснено here.Где создавать переменные среды пакета?

Я хочу установить некоторые переменные, которые будут доступны для всех моих функций пакета.

Эти переменные определяют: путь к наборам данных, характеристики измерений (такие как позиции зондов), физические константы и т. Д.

Я читал, что одним из рекомендуемых способов хранения таких переменных является использование сред.

Вопрос в том, где я могу поместить скрипт, создающий среду?

Я думал о том, чтобы поместить его в метод onLoad, чтобы убедиться, что он выполнен, когда пакет загружен.

+1

Что касается путей, вы можете определить их как опции, получающие каждый из них с помощью 'getOption' или переменные среды, извлекающие каждый из них с помощью' Sys.getenv' и определяющие их значения в вашем '.Rprofile'. Это сделает ваш пакет независимым от конкретных путей на вашем компьютере. Если сделать это только полунезависимым, тогда вы можете жестко закодировать конфигурацию по умолчанию, чтобы изначально ничего не нужно было устанавливать в вашем .Rprofile, но вы все равно можете изменить их без изменения пакета. –

ответ

3

Если вы поместили его в функцию .onLoad (а не метод), вам необходимо использовать функцию assign, чтобы обеспечить создание среды в пространстве имен пакетов.

.onLoad <- function(libname, pkgname) 
{ 
    # ... 
    assign("myPackageEnvironment", new.env(), parent.env()) 
    # ... 
} 

Но вы также можете просто положить его в открытом коде:

myPackageEnvironment <- new.env() 

неформально, вы можете думать о .r файлы вашего пакета как source d одна за другой в среде вашего пакета имен , Поэтому любые операторы, которые запускаются в открытом коде, будут создавать объекты там напрямую.

+0

Это означает, что я могу даже просто объявить свои переменные в файле R (не в среде) и использовать их в своих функциях пакета? – Ben

+0

Нет, вы не можете этого сделать. Объекты, созданные в пространстве имен пакетов, блокируются, поэтому вы не можете изменить их значения после загрузки. Дело в том, что в то время как объект _environment_ заблокирован, его _contents_ все еще могут быть изменены. –

+0

Но если мои переменные постоянны, они не должны меняться после загрузки пакета, это может сработать, не так ли? – Ben