在哪里创建软件包环境变量?

11

我正在进行数据分析,并创建了一个存储我的vignette和数据的包,正如这里所解释的那样。

我想设置一些变量,使它们对所有包函数都可用。

这些变量定义了:数据集的路径,测量特征(例如探针位置),物理常数等。

我已经阅读过,将这些变量存储在环境中是一种建议的方法。

问题是,我应该把创建环境的脚本放在哪里?

我考虑把它放在onLoad方法中,以确保在加载包时执行它。


2
关于路径,您可以将它们定义为选项,并使用 getOption 检索每个选项,或者将它们定义为环境变量,并使用 Sys.getenv 检索每个变量,并在 .Rprofile 中定义它们的值。这将使您的软件包独立于您机器上特定的路径。如果只需要半独立,则可以硬编码默认配置,以便最初无需在 .Rprofile 中设置任何内容,但仍然可以在不修改软件包的情况下更改它们。 - G. Grothendieck
1个回答

11

如果您将它放置在.onLoad函数(而不是方法)中,您将需要使用assign函数来确保环境在您的程序包命名空间中创建。

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

但你也可以将它放在开源代码中:

myPackageEnvironment <- new.env()

非正式地说,你可以将你的包中的.R文件视为逐个“source”到你的包命名空间环境中。因此,在打开代码中运行的任何语句都会直接在那里创建对象。


这意味着我甚至可以在R文件中声明变量(而不是在环境中),并在我的包函数中使用它们? - Ben
不,你不能这样做。在包命名空间中创建的对象是被锁定的,因此在加载后无法更改它们的值。关于环境的问题在于,虽然 环境对象 是被锁定的,但其 内容 仍然是可修改的。 - Hong Ooi
但是如果我的变量是常量,在包加载后不应该被更改,那么这样做应该可行,不是吗? - Ben
1
让我重新表述一下。包命名空间中的对象在编译时被锁定,因此当用户加载包时无法更改它们。这意味着您可以存储静态对象,如函数、类定义等,但不能存储在运行时确定的任何内容。 - Hong Ooi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接