2016-09-12 5 views
0

Как создать набор из R-функций, которые имеют доступ к одной и той же частной переменной?Как создать R-функции с частными переменными?

Предположим, я хочу создать readSetting(key) и writeSetting(key,value) функции, которые работают в одном и том же скрытом списке settings. Если бы я попробовать вот так ...

local({ 
    settings <- list() 
    readSetting <<- function (key) settings[[key]] 
    writeSetting <<- function (key, value) settings[[key]] = value 
}) 

... тогда readSetting и writeSetting не видны снаружи local вызова. Если я хочу, чтобы они были видны там, я должен сначала назначить

readSetting <- writeSetting <- NULL 

вне local вызова. Должен быть лучший способ, потому что мой код не СУХОЙ, если я должен сказать двумя разными способами, какие переменные являются общедоступными.

(Контекст этой работы является то, что я разрабатываю пакет R, и этот код будет в качестве вспомогательного файла, загруженного в основной файл через source.)

Этот вопрос связан с How to limit the scope of the variables used in a script? но ответы там не решают мою проблему.

+0

Вы можете посмотреть, как 'knitr' обрабатывает свои параметры (что похоже на' base :: options') в качестве примера. – Gregor

+0

Возможно, я немного замедлен, @ Грегор, но у меня проблемы с подключением. – Nathan

+0

Речь идет о единственном пакете, который я могу придумать, который имеет глобальные параметры, которые часто меняются. Параметры chunk можно было бы сделать невидимыми (более или менее), если 'knitr' не экспортировал' opts_chunk'. – Gregor

ответ

1

Вы можете моделировать Somthing как тот с помощью пакета R6Class и следующий очень грубый код:

Privates <- R6Class("Privates", 
       public=list(
        readSetting = function(key) { 
         private$settings[[key]] 
        }, 
        writeSetting = function(key,value) { 
         private$settings[[key]] <<- value 
        } 
        ), 
       private=list(
        settings = list() 
       ) 
) 
a <- Privates$new() 
a$writeSetting("a",4) 
a$readSetting("a") 

сразу читать о установив a$setting не будет работать.

+0

Выглядит хорошо. Вы также можете использовать среду, которая выполняет некоторые из базовых функций R, некоторые из них явно. Я думаю о 'stepfun' и' ecdf', но я подозреваю, что этот метод более надежный, поскольку вы должны иметь возможность экспортировать R6Classes. –

+0

Это похоже на то, что я пытаюсь сделать, но я не уверен, что хочу импортировать целый пакет классов для этой цели. – Nathan

+0

Все зависит от того, чего вы хотите достичь, и почему, или вы вообще действительно нуждаетесь в этом частном? – kwicher