我有几个在坐标系之间转换的函数,它们都依赖于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,了解事情的进展情况。
答案 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