2014-10-10 39 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