gpt4 book ai didi

r - 在构建具有多个单独函数的 R 包时避免使用全局对象

转载 作者:行者123 更新时间:2023-12-04 12:08:06 27 4
gpt4 key购买 nike

我已经构建了一个运行复杂贝叶斯模型(空间数据上的狄利克雷过程混合模型)的 R 包,包括 MCMC、细化和验证以及与 Googlemaps 的接口(interface)。我对性能非常满意,它运行没有问题。唯一的问题是我想把它放在 CRAN 上,但它会被拒绝,因为我广泛使用全局变量。

该软件包围绕使用 8 个核心功能(用户与之交互)构建:

1)LoadData:加载数据,提取关键信息,建立一系列全局矩阵以及其他小列表对象。

2) ModelParameters:设置模型参数,在 Googlemap 上的参数 sigma 上绘制先验选项。此时计算一个超先验并将一个大矩阵保存到全局环境中

3)GraphicParameters:设置 map 和地 block 的图形参数(见下方代码)

4) CreateMaps:在源位置 tau 上创建先验表面,并在 Google map 上绘制数据。保存许多全局对象,以便重复绘制此 map 。

5) RunMCMC:使用 MCMC 运行大部分分析(时间密集的步骤),创建许多全局对象。

6)ThinandAnalsye:对后验样本进行细化并构建地理剖面(一个时间密集的步骤)

7) PlotGP:绘制数据并将地理剖面叠加到谷歌地图上

8)reporthitscores:可选,如果源数据被导入,计算潜在源的命中分数

每一个在下一个之前依次运行,我将全局变量传递给一个或多个其他函数使用。

我以这种方式构建它是有原因的,因为用户必须先停止并评估这些功能的结果,然后才能继续使用 future 的功能。

这些函数中的每一个不仅传递固定参数,还传递大型 map 对象、列表和矩阵作为全局对象。我认为这是一个很好的简单解决方案,具有流畅的工作流程(您可以在继续之前检查主要工作环境中的结果,可能应用转换等),并且我为所有对象提供了唯一且信息丰富的名称。

我该如何解决这个问题,并通过 CRAN 的检查,同时保持一系列交互功能的用户友好工作流程?

我不想发布很多代码(因为只是 MCMC 部分长达数百行)

但我将包括一个简单的例子。 GraphicParameters 是我的一个简单的参数设置函数,它带有默认值设置。这是一个简单的示例,包中还有更复杂的示例。例如,有一个模型参数函数可以从现有数据加载函数中提取许多变量。

GraphicParameters <-
function(Guardrail=0.05, nring=20,transp=0.4,gridsize=640,gridsize2=300,MapType= "roadmap",Location=getwd(),pointcol="black") {

Guardrail<<-Guardrail
nring<<-nring
transp<<-transp
gridsize<<-gridsize
gridsize2<<-gridsize2
MapType<<-MapType
Location<<-Location
pointcol<<-pointcol

}

我看到的大多数关于避免全局对象的 Material 都是围绕一个可以完成所有工作的函数来解决的。我想保持我的逐步多功能方法,但松散全局对象。

任何帮助将不胜感激。

我知道这可能是对代码的重大修改(目前有 1000 行),所以我也喜欢对包的整体结构影响最小的解决方案。

附言我希望我在开始之前就知道 CRAN 对全局对象的不满!!!

最佳答案

您的问题非常适合 OOP 风格的设计。您可以使用reference classes or S4导出单个全局,例如 MapAnalysis类生成器。然后的想法是有人使用

 ma <- new('MapAnalysis', option1 = ..., option2 = ..., ...) # S4
# or
ma <- MapAnalysis$new(option1 = ..., ...) # refClass

然后可以调用你的方法
 ma$loadData(...)
ma$setParameters(...)

对象在内部对选项和辅助对象进行任何簿记。重构的工作量应该不大。如果您阅读了我在这篇文章顶部链接到的页面,您应该会看到可能只用 refClass('MapAnalysis', fields = (...), methods = (...)) 包装所有函数。几乎没有进一步的修改。 (尽管用 OOP 术语重新思考架构会对您有很多好处。)

关于r - 在构建具有多个单独函数的 R 包时避免使用全局对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22614439/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com