2015-05-01 25 views
2

我試圖使用lazyeval包創建R中的非標準評估,但是對substitutelazy之間有什麼區別感到困惑。R中的惰性和替換之間的區別

df <- data.frame(col1 = runif(10), col2 = runif(10)) 
> df 
     col1  col2 
1 0.54959138 0.8926778 
2 0.99857207 0.9649592 
3 0.26451336 0.9243096 
4 0.98755113 0.7155882 
5 0.84257525 0.5918387 
6 0.20692997 0.5875944 
7 0.44383744 0.5839235 
8 0.44014903 0.1006080 
9 0.49835993 0.7637619 
10 0.07162048 0.3155483 

我首先創建一個函數來取一個數據幀和兩個列名,並返回一個列,它是兩列的總和。 substituteeval似乎工作得很好。

SubSum <- function(data, x, y) { 
    exp <- substitute(x+y) 
    r <- eval(exp, data) 

    return(cbind(data, data.frame(sum=r))) 
} 

> SubSum(df, col1, col2) 
     col1  col2  sum 
1 0.54959138 0.8926778 1.4422692 
2 0.99857207 0.9649592 1.9635312 
3 0.26451336 0.9243096 1.1888229 
4 0.98755113 0.7155882 1.7031394 
5 0.84257525 0.5918387 1.4344140 
6 0.20692997 0.5875944 0.7945244 
7 0.44383744 0.5839235 1.0277610 
8 0.44014903 0.1006080 0.5407570 
9 0.49835993 0.7637619 1.2621218 
10 0.07162048 0.3155483 0.3871688 

然後我試圖創建lazylazy_eval的功能,但沒有奏效。

require(lazyeval) 
LazySum <- function(data, x, y) { 
    exp <- lazy(x+y) 
    r <- lazy_eval(exp, data) 

    return(cbind(data, data.frame(sum=r))) 
} 

> LazySum(df, col1, col2) 
Error in eval(expr, envir, enclos) : object 'col1' not found 

我現在的答案

一些試驗和錯誤後,該片段似乎工作。

LazySum <- function(data, x, y) { 
    exp <- interp(~x + y, x=lazy(x), y=lazy(y)) 
    r <- lazy_eval(exp, data) 

    return(cbind(data, data.frame(sum=r))) 
} 

基本上我不得不使用interp自己構建懶惰表達式。

回答

1

你非常接近。 閱讀?lazy尤其是例子來了解我對你的代碼

require(lazyeval) 
set.seed(357) 
df <- data.frame(col1 = runif(10), col2 = runif(10)) 
LazySum <- function(data, sum=x+y) { 
    exp <- lazy(sum) #giving lazy a named arguement 
    r <- lazy_eval(exp, data) 

    return(cbind(data, data.frame(sum=r))) 
} 

LazySum(df, col1+col2) 
+1

也做了改變,'lazyeval'的小插曲說明了lazy'和'substitute''之間的差異:HTTP://cran.r-project .org/web/packages/lazyeval/vignettes/lazyeval.html – sebpardo

+0

感謝您添加鏈接,正準備鏈接到它 – infominer

+0

謝謝,但不幸的是,這不是我想要的。我認爲用戶提供'col1 + col2'是多餘的和不安全的。該函數已被命名爲「LazySum」。用戶不需要再次指定操作。另外,如果他們提供「+」以外的東西,它仍然會評估併產生混淆。所以我正在尋找一個函數,它將兩列作爲單獨的參數,並使用'lazy'和'lazy_eval'返回總和。 –