2012-08-09 76 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