2016-08-10 54 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

相關問題