2012-08-09 45 views
4

我想有它调用subset的功能,并传递一个subset说法:通过函数传递子集参数子集

df <- data.frame(abc=c("A","A","B","B"),value=1:4) 
subset(df,abc=="A") 
## works of course: 
# abc value 
#1 A  1 
#2 A  2 

mysubset <- function(df,ssubset) 
    subset(df,ssubset) 

mysubset(df,abc=="A") 
## Throws an error 
# Error in eval(expr, envir, enclos) : object 'abc' not found 

mysubset2 <- function(df,ssubset) 
    subset(df,eval(ssubset)) 

mysubset2(df,expression(abc=="A")) 
## Works, but needs expression 

substitute尝试过,但没能找到合适的组合。我怎样才能得到这个工作?

+1

看一看这样的:https://github.com/hadley/ devtools/wiki /评价 – James 2012-08-09 10:05:49

+0

詹姆斯,感谢您的链接,它*非常*富有洞察力! – 2012-08-09 11:27:29

+0

相关问题:http://stackoverflow.com/questions/9860090/in-r-why-is-better-than-subset – flodel 2012-08-09 11:33:42

回答

11

你需要eval()parse()在那里了:

mysubset <- function(df, ssubset) { 
    subset(df, eval(parse(text=ssubset))) 
} 
mysubset(df, "abc=='A'") 
# abc value 
# 1 A  1 
# 2 A  2 

请注意,您需要嵌套引号,所以来回切换"并在必要时'之间。


基于您的评论,也许这样的事情是兴趣也:

mysubset <- function(df, ...) { 
    ssubset <- deparse(substitute(...)) 
    subset(df, eval(parse(text = ssubset))) 
} 

用法:mysubset(df, abc=='A')

+0

感谢您的回答。你知道是否有可能没有引号做到这一点? – 2013-12-19 13:27:42

+0

这是什么意思? 'mysubset < - function(df,...){ssubset < - deparse(substitute(...));子集(df,eval(parse(text = ssubset)))}'。用法:'mysubset(df,abc =='A')' – A5C1D2H2I1M1N2O1R2T1 2013-12-19 16:13:35

+0

太好了,谢谢你,接受你的回答。如果你可以在你的主要答案中增加这种可能性,那会很好。 – 2013-12-20 14:37:13