2013-12-02 3 views
1

У меня есть пара функций, которые преобразуют между системами координат, и все они полагаются на константы из эллипсоида WGS84 и т. Д. Я бы предпочел, чтобы эти константы не загрязняли глобальное пространство имен. Точно так же не все функции должны быть видны глобально.Аналоговые классы полезности в R?

В Java я инкапсулировал все элементы координат в класс утилиты и только раскрыл методы преобразования координат.

Что такое низкозатратный способ сделать это в R? В идеале я мог бы:

source("coordinateStuff.R") 

В верхней части моего файла и при необходимости называть «общедоступные» функции. Это может сделать хороший пакет по дороге, но сейчас это не проблема.


Edit для первоначального подхода:

Я начал 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, чтобы узнать, как обстоят дела.

ответ

4

Классы полезности в Java - это запах кода. Это не то, что вы хотите в R.

Есть несколько способов решения этого в R. Для средних/крупных вещей, путь, чтобы положить вам вещи в пакет и использовать его в оставшийся код. Это прекрасно сочетает ваши «частные» переменные и предоставляет четко определенный интерфейс.

Для небольших вещей, отличный способ сделать это, чтобы положить код в local вызова, который, как следует из названия, выполняет свой аргумент в локальной области видимости:

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

Наконец, вам может поставить свои объекты в список или среда (есть различия, но вы можете игнорировать их сейчас), а затем просто получить доступ к ним через listname$objname:

coordinateStuff <- list(
    foo = function() { cat('42\n') } 
    bar = 23 
) 

coordinateStuff$foo() 

Если вы хотите что-то похожее на ваш source заявление, take a look at my xsource command, который решает это в некоторой степени (хотя это незавершенное производство и имеет несколько проблем!). Это позволит вам написать

cs <- xsource(coordinateStuff) 

# Use cs as if it were an evironment, e.g. 

cs$public_function() 
# or even: 
cs::public_function() 
+0

Итак, java.lang.Math - это запах кода? Странный. –

+0

@ApprenticeQueue Да, абсолютно. Java приняло решение о разработке классов как элементарной единицы кода. И хотя это, безусловно, упрощает некоторые вещи, это бессмыслица с семантической точки зрения. Классы и модули кода являются отдельными концепциями, и их объединение между ними не требуется для ООП (хотя многие пользователи Java считают это), и это не служит более масштабной цели. –

+0

Эмуляция java.lang.Math - это то, что я имел в виду. Я боюсь, что несколько месяцев, потраченных на программирование на Java, возможно, повредили мой мозг. В любом случае, это дает мне несколько хороших идей, чтобы пожевать. –

1

Пакет является решением ...Но для быстрого решения вы можете использовать окружения http://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html

+0

Спасибо. Это похоже на немедленное решение, которое я могу уточнить в будущем. –

+1

Пожалуйста, ** рассмотрите ** создание пакета;) – Giupo

Смежные вопросы