2016-09-03 8 views
-1

私は関数のリストを持っています。それらを独立したオブジェクトなしで呼び出すことができます。たとえば:リスト内の関数の参照

funcs <- list(foo = function(a, b) a + b, 
       ## in a list, how can I call `foo` from `bar`? 
       bar = function(m) foo(m, m/2)) 

私は、現在の場所(例えば../foo)からではなく、関数呼び出しとして上に移動し、オーバーディレクトリ内に似て何かを探しています。

いくつかのコンテキスト:

いくつかの定義済みのmodeling elementsを持っているパッケージがあります。パラメータ値の範囲を知るために必要な新しい機能の要求があります。これらは現在、リスト内の関数でエンコードされています。例えば、部分最小二乗ため、パラメータ値は1との間で、データセット内の予測子の数の範囲とすることができる:

modelInfo <- list(## other list elements 
    grid = function(x, y, len = NULL, search = "grid") { 
     if(search == "grid") { 
      out <- data.frame(ncomp = seq(1, min(ncol(x) - 1, len), by = 1)) 
     } else { 
      out <- data.frame(ncomp = unique(sample(1:ncol(x), replace = TRUE))) 
     } 
     out 
    }, 
    ## more list elements 
) 

を私が可能な値をコードするboundsと呼ばれるリスト要素を追加したいとそれらを参照するのはgridです。私はboundsの関数データをgridに渡すことができましたが、それは新しい引数を追加し、多くの後方互換性を破ります。私は他の解決策がコードの大きな変更なしでboundsgridから参照することが可能であるとは思わなかった。代わりに、リストの

+2

あなたが解決しようとしている実際の問題は何ですか?この質問は[XY問題](http://xyproblem.info/)のように表示されます。 Rのリストは独自の環境を作成せず、Rの関数は作成された環境で実行されます。 – MrFlick

+0

そのようなリストを使用するのは意味がありません。おそらく、適切な機能を備えた適切なエンクロージャを使用する必要があります。あなたの例は、可能な解決策をテストするのに十分ではありません。あなたが適切な最小限の[再現可能な例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を作ったなら、可能な解決策を助けてテストする方が簡単です。なぜそれが**リストを持つ**ありますか? – MrFlick

答えて

2

、環境を使用します。

env <- new.env() 
env$foo <- function(a, b) a + b 
env$bar <- function(m) foo(m, m/2) 
environment(env$foo) <- environment(env$bar) <- env 

env$bar(3) 
# 4.5 
+0

機能はすでにパッケージに存在していますが、すべてを書き直すのを避けようとしています – topepo

+2

...あなたはあなたの質問に入れなかった情報を利用しないために私をdownvoteしましたか? –

+0

申し訳ありませんが、それは無礼でしたが、(より良い構造を提供する代わりに)そのデータ構造内の問題を解決する方法について質問がありました。 – topepo

2

foobarから検索パス上にありません。しかし、funcsは次のとおりです。

funcs <- list(foo = function(a, b) a + b, 
       bar = function(m) funcs$foo(m, m/2)) 
funcs$bar(3) 
#[1] 4.5 

すでにコンストラクタ関数を使用している場合は、あなたがこれを行うことができます:

constructFuncs <- function() { 
    foo <- function(a, b) a + b 
    bar <- function(m) foo(m, m/2) 
    list(foo = foo, bar = bar) 
} 
funcs <- constructFuncs() 
funcs$bar(3) 
#[1] 4.5 

しかし、私はより良いアプローチを使用することをお勧めします。この場合、環境(または場合によっては参照クラス?)がリストよりも好ましいと思われます。

関連する問題