模拟到R中的实用程序类?

时间:2013-12-02 20:18:20

标签: r

我有几个在坐标系之间转换的函数,它们都依赖于WGS84椭球等的常量。我宁愿不让这些常量污染全局命名空间。同样,并非所有功能都需要全局可见。

在Java中,我将所有坐标内容封装在实用程序类中,并且只显示坐标转换方法。

在R中执行此操作的低开销方式是什么?理想情况下,我可以:

source("coordinateStuff.R")

位于我的文件顶部,并根据需要调用“公共”功能。它可能会成为一个很好的方案,但现在这不是一个问题。


编辑初始方法:

我开始使用coords.R:

coords <- new.env()
with(coords, {
    ## Semi-major axis (center to equator)
    a <- 6378137.0
    ## And so on...
})

with语句和缩进清楚地表明赋值变量有所不同。它肯定胜过键入数以万计的assign语句。

第一次削减功能看起来像:

ecef2geodetic <- function (x,y,z) {
  attach(coords)
  on.exit(detach(coords))

on.exit()确保我们在函数退出时离开coords。但是当attach()中的一个函数在coords中调用另一个函数时,coords语句会造成麻烦。请参阅this question,了解事情的进展情况。

2 个答案:

答案 0 :(得分:4)

Java中的实用程序类是代码味道。这是你想要的R。

有几种方法可以在R中解决这个问题。对于中/大规模的事情,要做的就是将你的东西放入并在剩下的代码中使用它。这很好地封装了你的“私有”变量,并公开了一个定义良好的接口。

对于较小的事情,一种很好的方法是将代码放入 local调用中,顾名思义,它在本地范围内执行其参数:

x <- 23
result <- local({
    foo <- 42
    bar <- x
    foo * bar
})

最后,您可以将对象放入列表环境(存在差异,但您现在可以忽略它们),然后只需通过{{ 1}}:

listname$objname

如果您想要与coordinateStuff <- list( foo = function () { cat('42\n') } bar = 23 ) coordinateStuff$foo() 语句类似的内容,take a look at my xsource command可以在某种程度上解决这个问题(虽然它正在进行中并且有几个问题!)。这将允许你写

source

答案 1 :(得分:1)

包是解决方案......但是对于快速解决方案,您可以使用环境http://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html