如何检索...的内容作为调用列表?

时间:2014-04-24 12:58:14

标签: r parsing arguments expression substitution

如果我想查看传递给函数的表达式,我可以使用substitute检索它。

f <- function(x)
{
  substitute(x)  
}

f(sin(pi))
## sin(pi)

f返回类call的对象。substitute通常与deparse结合使用,将其转换为字符向量,但我不关心此处。)

我想在...中使用参数重复这一点。此尝试仅返回第一个参数:

g <- function(...)
{
  substitute(...)
}

g(sin(pi), cos(pi / 2))
## sin(pi)

此尝试会抛出错误:

h <- function(...)
{
  lapply(..., subsitute)
}

h(sin(pi), cos(pi / 2))
## Error in match.fun(FUN) :
##   'cos(pi/2)' is not a function, character or symbol

此尝试会抛出另一个错误:

i <- function(...)
{
  lapply(list(...), substitute)
}

i(sin(pi), cos(pi / 2))

## Error in lapply(list(...), substitute) : 
##   '...' used in an incorrect context

如何检索我传入...的表达式?

2 个答案:

答案 0 :(得分:3)

如果你想保留班级电话的目标:

i <- function(...)
{
  l <- match.call()
  l <- as.list(l)
  l <- l[-1]
  l
}

i <- function(...)
{
  l <- match.call()
  l[[1]] <- as.name("expression")
  l
}
i(sin(pi), cos(pi/2))

或许你只需要match.call取决于你想要做什么。 HTH

答案 1 :(得分:1)

试试这个:

substitute_multi <- function(...) {
   f <- function(e1, ...) {
      if (missing(e1)) return(NULL)
      else return(list(substitute(e1), substitute_multi(...)))
   }
   unlist(f(...))
}

例如:

substitute_multi(x, g(y), 1+2+3)
## [[1]]
## x
## 
## [[2]]
## g(y)
## 
## [[3]]
## 1 + 2 + 3

您也可以在结果上调用as.expression来获取expression个对象。

恕我直言,这个解决方案并不像其他解决方案那样优雅,但对...如何处理函数参数提供了一些见解。 :)