2016-08-10 4 views
1

私の究極の目標は、機能していすることができることです。Rの新しい環境に `` ... ``をどうやって渡すのですか?

  • は機能上で動作し
  • 関数を返すreturn関数がその親として.GlobalEnvと新しい環境を作成し、
  • を新しい環境内の引数関数を評価します。

それはこのような何か働くだろう:私はこれをしたい理由は、私は多くの場合、私はその大きな項目が含まれている関数内モデル/ ggplotを生成するアプリケーションを持っているということです

# Create an object that doesn't exist in the new.env 
iris2 <- iris 
model <- in_new_env(lm)(Sepal.Length ~ Sepal.Width, iris2) 

をmodel/ggplot呼び出しでは直接使用されません。これらのオブジェクトは呼び出し環境を抱えているため、オブジェクトを保存すると非常に大きくなったり、並列クラスタから戻ったりします。

マイスタートの試行は次のとおりです。

in_new_env <- function(.f){ 
    function(...) { 
    env <- new.env(parent = globalenv()) 
    # This doesn't seem to actually export the ... to env 
    assign("...", ..., envir = env) 
    env$.f <- .f 
    with(env, .f(...)) 
    # Error in eval(expr, envir, enclos) : '...' used in an incorrect context 
    } 
} 

私はenv...をエクスポートすることができた場合、これは動作します。これはどうすればいいですか?出来ますか? in_new_envの代替戦略の提案はありますか?

これは、Bill Dunlap hereによって提案されたソリューションの便利なラッパーになります。

+0

最近発表されたggghostパッケージを見てみると、ggplot2関数チェーンのように(少なくとも私が理解しているように)このようなことをしているようです。 (私はそれについての経験はありません)具体的には、「ggghostオブジェクトに含まれるコールを一覧表示する」と記述されている 'summary.ggghost'が要件を満たすかもしれないと考えています。 –

答えて

4

...は実際には変数ではありませんので、実際に割り当てることはできません。あなたがしようとしていることを理解していると思うなら、list(...)のようなものを使用して、関数に渡されたすべてのパラメータを評価し、それらをリストに格納することができます。次に、do.call()を使用して、そのパラメーターのリストを別の関数に渡し、別の環境でそれをevalqと評価することができます。私はこれが何をしたいんだと思う...もちろん

in_new_env <- function(.f){ 
    function(...) { 
    params <- list(...) 
    env <- new.env(parent = globalenv()) 
    assign(".params.", params, envir = env) 
    env$.f <- .f 
    evalq(do.call(".f", .params.), envir=env) 

    } 
} 

iris2 <- iris 
model <- in_new_env(lm)(Sepal.Length ~ Sepal.Width, iris2) 

それは.f関数名を覚えているという点で、オブジェクトへの呼び出しは少しオフになっているが、そのためにあなたの計画が何であったか私には明確ではありませんでしたあなたの提案した機能と一緒に。

+0

私はあなたが '' ... "' '' '' 'の名前ではないと言っていると思います。 –

+0

これは確かに私の質問に答えます。ありがとう!残念ながら、これは私の問題を解決しません。私はまだ式オブジェクト "Sepal.Length〜Sepal.Width"が関数環境の不要な部分を持ち歩いているという問題があります。 – kennyB

+0

@ 42-私の主張は、「...」に代入して関数内で「働かせる」方法がないことだと思います。記号 '...'は特別なモードを持っているので、実際には "普通の"変数のように振る舞いません。あなたはそれがどこにあるかの例があれば私は好奇心が強いでしょう。 – MrFlick

関連する問題