2014-10-10 75 views
1

我想將某些查詢傳遞給使用'eval'的較低級別的函數。這裏有一個簡單的例子:R:將值傳遞給嵌套函數中的eval

f1 <- function(x, q) eval(substitute(q), envir=x) 
f2 <- function(x, q) f1(x, q) 

發生了什麼事:

> x <- data.frame(a=1:5) 
> f1(x, a<3) 
[1] TRUE TRUE FALSE FALSE FALSE 
> f2(x, a<3) 
Error in eval(expr, envir, enclos) : object 'a' not found 

雖然我想F2產生類似F1相同的輸出。參數'q'是一些將在'x'上評估的通用查詢。我保持這個例子簡單而一般,但我想擴展它在更復雜的函數和查詢上的行爲。對我來說重要的是如何「傳遞」查詢「q」,以便eval知道如何處理它,而不管之前有多少嵌套函數級別。

我該怎麼做?謝謝!

+0

是身體'f2'你願意修改的唯一的事情? – flodel 2014-10-10 10:57:59

+0

對不起,我不確定你的意思是...?我可以修改任何f1或f2函數,唯一重要的是它們都與相同的參數相同,其中'q'是我想評估'x'的一般查詢。 – Tim 2014-10-10 11:04:36

回答

2

你可以這樣做:

f1 <- function(x, q) eval(substitute(q), envir=x) 
f2 <- function(x, q) eval(substitute(f1(x, q))) 

y <- data.frame(a=1:5) 
f1(y, a<3) 
f2(y, a<3) 
+0

對!很簡單... – Tim 2014-10-10 11:08:36

0

因爲你只是定義x。您需要:

> f2(x, x$a<3) 
> [1] TRUE TRUE FALSE FALSE FALSE 
+0

這是一個**簡化的**示例。一般來說,我希望函數做更復雜的事情,所以我想將查詢'q'按原樣傳遞給下層函數並對其進行求值,所以它在f1和f2中使用相同的函數參數。 – Tim 2014-10-10 11:01:59