2016-09-12 12 views
0

すべてのR関数が同じプライベート変数にアクセスする一連のR関数を作成するにはどうすればよいですか?プライベート変数でR関数を作成するには?

たとえば、readSetting(key)writeSetting(key,value)という関数を作成して、両方とも同じ隠しリストsettingsで操作したいとします。私はそうのようにそれをしようとすると...

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

...その後readSettingwriteSettinglocalコールの外には見えません。そこに表示させたい場合は、

readSetting <- writeSetting <- NULL 

localコールの外に割り当てる必要があります。より良い方法が必要です。変数が公開されている2つの異なる方法で言わなければならないと、私のコードはDRYではないからです。

(この作品のコンテキストが、私はRのパッケージを開発していて、このコードはsourceを介してメインファイルにロードされた補助ファイルになるということです。)

この質問はHow to limit the scope of the variables used in a script?に関連しているが、答えが私の問題を解決することはありません。

+0

'knitr'がそのオプション(' base :: options'に似ているようです)をどのように扱うのかを見ることができます。 – Gregor

+0

おそらく私は少し遅い@Gregorですが、接続が見苦しいです。 – Nathan

+0

これは私が考えることができる唯一のパッケージです。それは頻繁に変更されるグローバルオプションを持っています。 'knitr'が' opts_chunk'をエクスポートしなかった場合、チャンクオプションはすべて不可視(多かれ少なかれ)になる可能性があります。 – Gregor

答えて

1

あなたが使用して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が動作しない設定oを読みました。

+0

いいですね。ベースR関数のいくつかを明示的に使用する環境を使用することもできます。私は 'stepfun'と' ecdf'を考えていますが、R6Classをエクスポートできるはずなので、この方法はもっと頑強だと思います。 –

+0

それは私がやろうとしていることの中心に打ちそうであるようですが、この1つのクラスパッケージ全体をインポートしたいとは思っていません。 – Nathan

+0

それはすべてあなたが達成したいと思っていることと、なぜ、それとも本当にそれをプライベートにする必要があるのか​​によって異なりますか? – kwicher

関連する問題