对子集函数的标准评估参数
我想在另一个函数中使用subset
,但是要从顶层函数传递非标准的评估参数。 以下是非工作代码,但概述了这个想法:
foo_1 <- function(x, mysubset)
{
# some deparse, substitute etc. magic here ??
subset(x, subset)
}
foo_1(ansombe, x1 > 5)
我希望得到与subset(ansombe, x1 > 5)
相同的结果。 另外,我希望当参数传递到更深层次时也是如此
foo_2 <- function(x, mysubset)
{
# some deparse, substitute etc. magic here ??
foo_1(x, mysubset)
}
foo_2(ansombe, x1 > 5)
这里我也想要和上面一样的结果。
我到目前为止所尝试过的
我尝试了一个substitute
- deparse
, eval
- parse
组合,就像
foo_1 <- function(x, mysubset)
{
tx <- deparse(substitute(mysubset))
subset(x, eval(parse(text=tx)))
}
foo_1(anscombe, x1 >5)
这很好,但我现在如何继续foo_2
?
另外,我还记得Thomas Lumley的格言:
如果答案是parse(),你通常应该重新思考这个问题。 - Thomas Lumley(R-help,2005年2月)
所以,我想知道是否有更好的方法比eval
- parse
组合。? 有任何想法吗?
PS。 这个问题是相似的,但不包括更深的嵌套:通过函数传递子集参数到子集
PPS:也许这是成果丰硕的应用.
功能从plyr
,但我不知道如何...
只要你尽可能延缓这种假设,就应该这样做
foo_1 <- function(x, mysubset)
{
do.call("subset", list(quote(x), substitute(mysubset)))
}
foo_2 <- function(x, mysubset)
{
do.call("foo_1", list(quote(x), substitute(mysubset)))
}
data(anscombe)
foo_1(anscombe, x1 > 5)
foo_2(anscombe, x1 > 5)
但是如果你打算用mysubset
你,你需要更加mysubset
这将有助于准确地知道你为什么这样做。
可能有龙。 (但那些也隐藏在subset
。)
foo_1 <- function(x, mysubset)
{
sub <- eval(substitute(mysubset), envir=x, enclos=parent.frame())
x[sub,]
}
foo_1(iris, Sepal.Length == 5 & Species == "setosa")
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#5 5 3.6 1.4 0.2 setosa
#8 5 3.4 1.5 0.2 setosa
#26 5 3.0 1.6 0.2 setosa
#27 5 3.4 1.6 0.4 setosa
#36 5 3.2 1.2 0.2 setosa
#41 5 3.5 1.3 0.3 setosa
#44 5 3.5 1.6 0.6 setosa
#50 5 3.3 1.4 0.2 setosa
我不认为你可以避免eval
,但你可以避免parse
。 只需重新调用函数中的subset
:
foo_1 <- function(x, mysubset) {
eval(call("subset", x, substitute(mysubset)), parent.frame())
}
foo_1(mtcars, cyl == 6 & mpg > 20)
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
链接地址: http://www.djcxy.com/p/73899.html