2011-01-12 34 views
5

這裏有一些對於R評估器如何處理函數調用的基本知識的流利者來說有點困惑。假設我想編寫一個採用R語句的函數,與我在命令行編寫的語句相同,並將它和回聲結果進行回聲。例如:Verbatim命令參數:deparse(substitute(foo))在一個包裝器中

> p.eval(sum(1:3)) 
sum(1:3) --> 6 

這很簡單;這裏有一個p.eval()定義:

p.eval <- function(v,prefix="--> ") { 
    cmd <- deparse(substitute(v)); cat(cmd,prefix,v,"\n") 
} 

但是假設我現在想寫周圍p.eval的包裝,要調用的同樣的方式;也許作爲一個有點瘋狂的二元運算與虛擬第二個參數:

%PE% <- function(x,...) p.eval(x) 

我想調用它像這樣:sum(1:3) %PE% 0應相當於舊p.eval(sum(1:3))。這當然不起作用,因爲p.eval()deparse(substitute())現在給出x

對開明的問題:有沒有辦法讓這項工作符合我的願望?對於這個特殊的用法,我很好的通過複製/粘貼p.eval的單行定義來定義%PE%,所以這個問題主要是學術性問題。也許我會學習一些關於R評估者的基本知識:)

PS:爲什麼會發現上面的函數有用?假設我開發了一些分析代碼並通過org-babel非交互式地調用它(如果你是組織模式和/或Emacs用戶,這絕對值得玩)。默認情況下,org-babel會在解釋器中評估事物時輸出輸出。因此,如果我想獲得除原始數字之外的任何內容,我必須明確地構建要通過catpaste打印的字符串,但是誰願意在通過分析進行飛行時這樣做?..上面的黑客可以簡單地追加%PE%0在想要打印的行後面,並將此命令回顯到組織輸出。

+1

如果你走這條路,我建議閱讀的https:/ /github.com/hadley/devtools/wiki/Evaluation,特別是「從其他功能調用」部分 – hadley 2011-01-14 18:30:40

+0

優秀的資源,哈德利。期待完成其他部分。 – 2011-01-14 22:38:39

回答

11

試試這個:

> "%PE%" <- function(x, ...) do.call(p.eval, list(substitute(x))) 
> sum(1:3) %PE% 0 
sum(1:3) --> 6 
1

也可能只是p.eval回報 「V」,然後:

p.eval <- function(v,prefix="--> ") { 
     cmd <- deparse(substitute(v)); cat(cmd,prefix,v,"\n") ; return(v) } 
"%PE%" <- function(x, y=NULL) x 
sum(1:3) %PE% Inf 
#[1] 6 
sum(1:3) %PE% # won't accept single argument 
    r # give it anything 
#[1] 6