如何将引用应用于函数中的每个参数

时间:2014-10-26 18:24:54

标签: r

以下是我想做的事情:

as.character(quote(x))
[1] "x"

现在我想把它放在一个函数中。

qq <- function(a) as.character(substitute(a))
qq(x)
[1] "x"

精细。但是:

qq <- function(...) as.character(substitute(...))
qq(x,y,z)
[1] "x"

好的,怎么样:

qq <- function(...) sapply(..., function (x) as.character(substitute(x)))
qq(x,y,z)
Error in get(as.character(FUN), mode = "function", envir = envir) : 
object 'y' of mode 'function' was not found 

并且:

qq <- function(...) sapply(list(...), function (x) as.character(substitute(x)))
qq(x,y,z)
Error in lapply(X = X, FUN = FUN, ...) : object 'z' not found 

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:3)

您可以尝试match.call

foo <- function(...) {
    sapply(as.list(match.call())[-1], deparse)
}
foo(x, y, z)
# [1] "x" "y" "z"
foo(a, b, c, d, e)
# [1] "a" "b" "c" "d" "e"

如果还有其他参数,您可能需要对上述功能进行一些修改。

foo2 <- function(x, ...) {
    a <- as.list(match.call(expand.dots = FALSE))$...
    sapply(a, deparse)
}
foo2(5, x, y, z)
# [1] "x" "y" "z"

答案 1 :(得分:2)

试试这个:

qq <- function(...) sapply(substitute({ ... })[-1], deparse)
qq(a, b, c)
## [1] "a" "b" "c"

注意: qq <- function(...) as.character(substitute(...))如果传递了一个参数qq(a),那么问题就在于substitute期待一个参数,而不是几个。 {...}将多个参数转换为一个。