如果我想查看传递给函数的表达式,我可以使用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
如何检索我传入...
的表达式?
答案 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
个对象。
恕我直言,这个解决方案并不像其他解决方案那样优雅,但对...
如何处理函数参数提供了一些见解。 :)