2011-02-25 70 views
3

說我有這樣的代碼:評估switch語句中的匿名函數(S)

tmp <- switch("b", 
       a = print("foo"), 
       b = function() paste("I want to evaluate this one!"), 
       stop("say what now?") 
) 

現在,如果我型tmp我得到一個未計算的功能,所以我必須做的添加一對括號之後爲了評價它:

tmp 
## function() paste("I want to evaluate this one!") 
tmp() 
## [1] "I want to evaluate this one!" 

當然,我可以預先設置這個功能和內switch通過它(在它不是匿名的話),但我想知道是否有可能和/或合理的評估匿名功能在switch聲明中。

+0

我很努力想知道爲什麼'b'不能只是粘貼(「我想評估這個!」),即得到R來評估該語句,以提供一個返回的對象,將得到傳遞給'tmp'?如果最終結果是將評估結果放在'tmp'中,我沒有明白爲什麼要這樣做?你能提供更多的信息或解釋嗎? – 2011-02-25 14:28:20

+2

AFAIK這是默認行爲(打印對象)。 – 2011-02-25 14:41:45

回答

2

我想一個可以安排do.call()調用匿名函數:

tmp <- switch("b", 
       a = print("foo"), 
       b = do.call(function() paste("I want to evaluate this one!"), 
          list()), 
       stop("say what now?") 
) 

例如爲:

> tmp 
[1] "I want to evaluate this one!" 

埃德它 上述情況的一個簡單的版本是:

tmp <- switch("b", 
       a = print("foo"), 
       b = (function() paste("I want to evaluate this one!"))(), 
       stop("say what now?") 
) 

所以在第一組括號和由此產生的函數創建的匿名函數通過附加第二套()調用。


但似乎吸塵器我把匿名函數到一個名爲函數,並調用它:

foo <- function() paste("I want to evaluate this one!") 
tmp <- switch("b", 
       a = print("foo"), 
       b = foo(), 
       stop("say what now?") 
) 

具有相同的最終結果:

> tmp 
[1] "I want to evaluate this one!" 

如果這是所有在一個函數內,foo()可以內聯定義,所以它只存在於執行外部函數調用期間。

+0

+1這一個!我認爲解決方案將會非常簡單並且非常明顯......我特別喜歡'(tmp)()'detail ... =) – aL3xa 2011-02-25 22:00:28

1

從我記得,寫你的對象(是data.frame,一個列表或在你的情況下,一個函數)沒有大括號喚起print()

很明顯:

> class(tmp()) 
[1] "character" 
> class(tmp) 
[1] "function" 
+0

+1:非常正確 – 2011-02-25 15:33:56

+0

我不確定這是@ aL3xa正在做什麼。我理解Q是指我如何獲得匿名內聯函數,並對其進行評估並調用,使得'tmp'返回Q中顯示的代碼中'tmp()'目前的功能。他實際上希望'tmp'來保存**匿名功能的調用結果**。 – 2011-02-25 15:35:42

+0

當然,但我想評估功能...加文得到它... =) – aL3xa 2011-02-25 22:01:27

1

正如羅曼說,你得到一個函數返回。如果你想得到一個函數的結果,那麼只需放置函數(在你的情況下,放棄function())。如果你想的不同功能的組合,把它放在括號:

tmp <- switch("b", 
       a = print("foo"), 
       b = { 
        x <- paste("I want to evaluate this one!") 
        x <- paste(x,sample(1:10,1)) 
        print(x) 
       }, 
       stop("say what now?") 
) 

但是你應該知道,你只保留了結果,所以你總是從sample有同樣的結果。