我是要添加到CRAN的两个软件包的维护者。它们被拒绝是因为某些函数将变量赋给.GlobalEnv
。现在我试图找到一种不同但又方便的方法来处理这些变量。
这两个包都属于Database of Odorant Responses, DoOR。我们在DoOR.data
包中收集已发布的气味响应数据,DoOR.functions
包中的算法将这些数据合并到一个共识数据集中。
数据包包含预先计算的共识数据集。用户能够修改基础原始数据集(例如,添加他自己的数据集,删除一些......)并计算新的共识数据集。因此,函数必须能够访问修改后的数据集。
最简单的方法是将完整的包数据加载到.GlobalEnv
(通过一个函数),然后在那里修改数据。对于用户来说,这也是直截了当的,因为他在“主要”环境中看到了相关的数据集。问题是写入用户环境是不好的做法,CRAN不会以这种方式接受包(可理解)。
.GlobalEnv
,非显式通过 parent.frame()
- Hadley指出这仍然很糟糕,最后我们写入用户环境。door.env <- new.env()
。
door.env
不在搜索路径中,因此函数attach(door.env)
放入搜索路径,据我所知,在搜索路径中创建了一个新环境,因此new.env()
中的任何进一步编辑都会被函数忽略new.env
中查看和编辑用户的数据很复杂,我宁愿找到一个用户不必学习环境处理的解决方案所以底线,我尝试了所有解决方案,我最终在不同的环境中使用了多个数据集副本,我担心这会让我们打包的普通用户感到困惑(包括我:))
希望有人知道在哪里存储数据,用户和功能都可以轻松访问。
编辑:数据存储为*.RData
包中/ data下的DoOR.data
个文件。我尝试使用LazyData = true
来避免将所有数据加载到.GlobalEnv
中。这很好用,带有操纵/更新数据的问题仍然存在。