【问题标题】:Pass subset argument through a function to subset通过函数将子集参数传递给子集
【发布时间】:2012-08-06 12:43:48
【问题描述】:

我想要一个调用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,但找不到正确的组合。我怎样才能让它工作?

【问题讨论】:

标签: r subset


【解决方案1】:

A5C1D2H2I1M1N2O1R2T1 答案有效,但您可以跳过整个解析/解析周期,只需使用:

mysubset <- function(df, p) {
  ps <- substitute(p)
  subset(df, eval(ps))
}

【讨论】:

    【解决方案2】:

    你也需要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')

    【讨论】:

    • 感谢您的回答。你知道是否有可能不加引号吗?
    • 你的意思是这样的? mysubset &lt;- function(df, ...) { ssubset &lt;- deparse(substitute(...)); subset(df, eval(parse(text = ssubset))) }。用法:mysubset(df, abc=='A')
    • 太好了,谢谢您,接受您的回答。如果您也可以在主要答案中添加这种可能性,那就太好了。
    猜你喜欢
    • 2020-07-29
    • 1970-01-01
    • 2015-02-17
    • 2016-05-05
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2014-10-26
    • 2018-03-13
    相关资源
    最近更新 更多