2016-08-10 19 views
1

我的最终目标是能够有一个函数:如何将``...``传递给R中的新环境?

  • 上的功能进行操作,并返回一个函数
  • 返回函数创建一个.GlobalEnv一个新的环境,其母公司和,
  • 评估新环境中的参数函数。

它的工作是这样的:

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

我想这样做的原因是,我经常在这里我想生成一个函数内部模型/ ggplot应用程序中含有大量的项目,不会直接用在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函数链。 (我没有经验。)特别想到'summary.ggghost',描述为“列出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

相关问题