对子集函数的标准评估参数

我想在另一个函数中使用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 - deparseeval - 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

上一篇: standard evaluation arguments to the subset function

下一篇: subset across multiple columns in r