我应该在哪个环境中存储用户(和函数)应该能够修改的包数据?

时间:2015-10-21 15:32:39

标签: r namespaces package

背景

我是要添加到CRAN的两个软件包的维护者。它们被拒绝是因为某些函数将变量赋给.GlobalEnv。现在我试图找到一种不同但又方便的方法来处理这些变量。

这两个包都属于Database of Odorant Responses, DoOR。我们在DoOR.data包中收集已发布的气味响应数据,DoOR.functions包中的算法将这些数据合并到一个共识数据集中。

预期功能

数据包包含预先计算的共识数据集。用户能够修改基础原始数据集(例如,添加他自己的数据集,删除一些......)并计算新的共识数据集。因此,函数必须能够访问修改后的数据集。

最简单的方法是将完整的包数据加载到.GlobalEnv通过一个函数),然后在那里修改数据。对于用户来说,这也是直截了当的,因为他在“主要”环境中看到了相关的数据集。问题是写入用户环境是不好的做法,CRAN不会以这种方式接受包(可理解)。

我尝试过的事情

  1. 仅将修改后的数据集分配到.GlobalEnv,非显式通过 parent.frame() - Hadley指出这仍然很糟糕,最后我们写入用户环境。
  2. 仅将修改后的数据集写入专用的新环境door.env <- new.env()
    1. door.env不在搜索路径中,因此函数
    2. 会忽略其中的数据
    3. attach(door.env)放入搜索路径,据我所知,在搜索路径中创建了一个新环境,因此new.env()中的任何进一步编辑都会被函数忽略
    4. new.env中查看和编辑用户的数据很复杂,我宁愿找到一个用户不必学习环境处理的解决方案
  3. 所以底线,我尝试了所有解决方案,我最终在不同的环境中使用了多个数据集副本,我担心这会让我们打包的普通用户感到困惑(包括我:))

    希望有人知道在哪里存储数据,用户和功能都可以轻松访问。

    编辑:数据存储为*.RData包中/ data下的DoOR.data个文件。我尝试使用LazyData = true来避免将所有数据加载到.GlobalEnv中。这很好用,带有操纵/更新数据的问题仍然存在。

0 个答案:

没有答案