【问题标题】:Where to create package environment variables?在哪里创建包环境变量?
【发布时间】:2017-06-16 16:42:28
【问题描述】:

我正在进行数据分析并创建了一个包来存储我的小插曲和数据,如 here 所述。

我想设置一些可用于我的所有包函数的变量。

这些变量定义:数据集的路径、测量特性(如探头位置)、物理常数等。

我已阅读到存储此类变量的一种推荐方法是使用环境。

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

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

【问题讨论】:

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

标签: r environment-variables r-package


【解决方案1】:

如果你把它放在.onLoad 函数(不是方法)中,你必须使用assign 函数来确保在你的包命名空间中创建环境。

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

但你也可以直接把它放在开放代码中:

myPackageEnvironment <- new.env()

非正式地,您可以将包的 .R 文件视为sourced 一个接一个地进入包命名空间的环境。所以任何在开放代码中运行的语句都会直接在那里创建对象。

【讨论】:

  • 这意味着我什至可以在 R 文件中(而不是在环境中)声明我的变量并在我的包函数中使用它们?
  • 不,你不能那样做。在包命名空间中创建的对象是锁定的,因此您无法在加载后更改它们的值。环境的问题是,当 环境对象 被锁定时,它的 内容 仍然是可修改的。
  • 但是如果我的变量是常量,在包加载后不应该改变,那可以工作,不是吗?
  • 让我换个说法。包命名空间中的对象在编译时被锁定,因此当用户加载包时它们不能被更改。这意味着您可以存储静态对象,如函数、类定义等,但不能存储在运行时确定的任何内容。
猜你喜欢
  • 2018-11-12
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多