Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
298 views
in Technique[技术] by (71.8m points)

r - Pass subset argument through a function to subset

I would like to have a function which calls subset, and passes on a subset argument:

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

I tried with substitute, but was not able to find the right combination. How can I get this working?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You need eval() and parse() in there too:

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

Note that you need to nest quotes, so switch back and forth between " and ' as necessary.


Based on your comment, perhaps something like this is also of interest:

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

USAGE: mysubset(df, abc=='A')


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...